RecyclerView添加ViewPager头部

项目需要的效果如图:
图片描述

我想的是RecyclerView添加一个ViewPager头部实现。代码如下(Fragment.onActivityCreated()里的代码):

     //init vp_banner;
        vp_banner = getLayoutInflater().inflate(R.layout.life_header, null);
        BannerAdapter bannerAdapter = new BannerAdapter(MyApplication.pics, this);
        ((ViewPager)vp_banner).setAdapter(bannerAdapter);

        //init rv_items;
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3, LinearLayoutManager.VERTICAL, false);
        rv_items.setLayoutManager(gridLayoutManager);

        initItems();
        MainItemsAdapter adapter = new MainItemsAdapter(functionItemList, this, vp_banner);
        rv_items.setAdapter(adapter);
        gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                if (position == 0) {
                    return 3;
                }
                return 1;
            }
        });

MainItemAdapter.java:

public class MainItemsAdapter extends RecyclerView.Adapter<MainItemsAdapter.ViewHolder> implements View.OnClickListener {
    private List<FunctionItem> functionItemList;
    private final static int VIEW_HEADER = 1, VIEW_ITEM = 0;
    private LayoutInflater layoutInflater;
    private Context context;
    private View header;
    public MainItemsAdapter(List<FunctionItem> functionItemList, Context context, View header) {
        this.functionItemList = functionItemList;
        layoutInflater = LayoutInflater.from(context);
        this.context = context;
        this.header = header;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view;
        if (viewType == VIEW_HEADER) {
            return new ViewHolder(header, viewType);
        } else {
            view = layoutInflater.inflate(R.layout.life_item, null);
            ViewHolder viewHolder = new ViewHolder(view, viewType);
            viewHolder.ll_item.setOnClickListener(this);
            return viewHolder;
        }
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        if (getItemViewType(position) == VIEW_HEADER) {


//            holder.vp_banner.setImageResource(MyApplication.pics[0]);
        } else {
            FunctionItem functionItem = functionItemList.get(position - 1);
            holder.iv_itemPic.setImageResource(functionItem.getPic());
            holder.tv_itemName.setText(functionItem.getName());
            holder.ll_item.setTag(functionItem.getId());
        }
    }

    @Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return VIEW_HEADER;
        } else {
            return VIEW_ITEM;
        }
    }

    @Override
    public int getItemCount() {
        return functionItemList.size() + 1;
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.item) {
            LogUtil.e("Life", "--->" + v.getTag());
        }
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        ImageView iv_itemPic;
        TextView tv_itemName;
        LinearLayout ll_item;
        public ViewHolder(View itemView, int viewType) {
            super(itemView);
            if (viewType == VIEW_HEADER) {
                // init view pager

            } else {
                iv_itemPic = (ImageView) itemView.findViewById(R.id.itemPic);
                tv_itemName = (TextView) itemView.findViewById(R.id.itemName);
                ll_item = (LinearLayout) itemView.findViewById(R.id.item);
            }
        }
    }
}

主布局文件:

<android.support.v7.widget.RecyclerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/items"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</android.support.v7.widget.RecyclerView>

life_header.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/banner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
</android.support.v4.view.ViewPager>

BannerAdapter.java

public class BannerAdapter extends PagerAdapter {
    int[] pics;
    Context context;

    public BannerAdapter(int[] pics, Context context) {
        this.pics = pics;
        this.context = context;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        super.destroyItem(container, position, object);
        container.removeView((View) object);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        ImageView imageView = new ImageView(context);
        imageView.setImageResource(pics[position]);
        container.addView(imageView);
        return imageView;
    }

    @Override
    public int getCount() {
        return pics.length;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }
}

目前的问题是ViewPager无法显示,打印输出高宽为0。不明为什么会这样,怎么解决,求高手指点。

阅读 12.4k
5 个回答

问题已经解决。
需要修改两个地方:
1.vp_banner = getLayoutInflater().inflate(R.layout.life_header, null); 需要改为
vp_banner = getLayoutInflater().inflate(R.layout.life_header, fl_parent, false);
2.life_header.xml布局文件里的宽高需要使用Exactly模式(match_parent或者写死尺寸)

我尝试了,目前没发现问题在哪,解不掉。

看你的代码和这个答案类似,你可以做下对比: http://stackoverflow.com/questions/26530685/is-there-an-addheaderview-equivalent-for-recyclerview
一个类似的答案 http://stackoverflow.com/questions/26448717/android-5-0-add-header-footer-to-a-recyclerview

但是我觉得这种做法有点儿复杂,所以,如果不是必须要采用这种方法的话,可以尝试使用lib,以下是我找到的星星最多的两个相关项目(我还没来得及验证)
https://github.com/blipinsk/RecyclerViewHeader
https://github.com/cundong/HeaderAndFooterRecyclerView

很遗憾未能看出你的问题在哪,需要提供更多信息,你的布局文件都是怎样的?

你把viewpager设定一个高度试试,比如250dp

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题