android 給多列的RecycleView新增頭佈局
阿新 • • 發佈:2019-01-01
在工作中遇到商城類的介面,介面上半部分是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() { @Overridepublic 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)
是資原始檔裡的尺寸