在工作中遇到商城类的界面,界面上半部分是viewpager,下部分是多列的GridView,具体实现:
1、在设置RecycleView的manager时使用GridlayoutManager的
setSpanSizeLookup属性设置头布局所占的宽度:
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { if (position == 0) { return 头布局所占的个数; } else { return 1; } } });
在Adapter中给RecycleView.Adapter设置一个setHeadView()方法,在adapter中接收头布局,然后在判断条目的类型时如果是头的话,就直接将view添加进去,如果是正常的条目,就按正常的加。
具体代码:
GridLayoutManager manager = new GridLayoutManager(getContext(), 2); manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { if (position == 0) { return 3; } else { return 1; } } }); manager.setOrientation(LinearLayoutManager.VERTICAL); recycleview.setLayoutManager(manager); mAdapter = new MyRecycleAdapter(getContext(), list); // headView = View.inflate(getContext(), R.layout.shop_head, null); headView = new Recycle(getContext()); //设置轮播图的图片 headView.setImages(images); // initHeadView(); mAdapter.addHeadView(headView); recycleview.setAdapter(mAdapter);
adapter代码:
public class MyRecycleAdapter extends RecyclerView.Adapter<MyRecycleAdapterHolder> { private View headView; private Context mContext; private List<String> count; public MyRecycleAdapter(Context mContext, List<String> list ) { this.count = list; this.mContext = mContext; } /** * 设置数据源总的条目 */ @Override public int getItemCount() { //返回条目数加头布局个数 return count==null? 2:count.size()+2; } @Override public void onBindViewHolder(MyRecycleAdapterHolder holder, final int position) { int itemViewType = getItemViewType(position); // 头部 if (itemViewType == ShopFragment.HEADER_RECYCLER_VIEW_ITEM) { return; } else if (itemViewType == ShopFragment.NORMAL_RECYCLER_VIEW_ITEM) {//普通条目 /*holder.iv_add.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mContext, "添加购物车", Toast.LENGTH_SHORT).show(); if (mOnImageClickListener != null) { mOnImageClickListener.onClick(); } } });*/ holder.pic.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(mContext, ShowActivity.class); Bundle bundle = new Bundle(); bundle.putInt("Item", i); intent.putExtra("fragment", DetailFragment.class); mContext.startActivity(intent); } }); } } @Override public MyRecycleAdapterHolder onCreateViewHolder(ViewGroup parent, int viewType) { View root = null; if (viewType == ShopFragment.HEADER_RECYCLER_VIEW_ITEM) { root = headView; } else { root = LayoutInflater.from(mContext).inflate(R.layout.shop_item_adapter, parent, false); } return new MyRecycleAdapterHolder(root, viewType); } /** * 添加自定义头部 */ public void addHeadView(View view) { this.headView = view; } @Override public int getItemViewType(int position) { if (position == 0) { return ShopFragment.HEADER_RECYCLER_VIEW_ITEM; } else { return ShopFragment.NORMAL_RECYCLER_VIEW_ITEM; } } private OnImageClickListener mOnImageClickListener; public void setOnItemClickListener(OnImageClickListener listener) { mOnImageClickListener = listener; } public interface OnImageClickListener { void onClick(); } }
代码中定义尺寸
businessRecycler.addItemDecoration(new GridSpacingItemDecoration(4, getResources().getDimensionPixelSize(R.dimen.y4), true));getResources().getDimensionPixelSize(R.dimen.y4)
是资源文件里的尺寸