一、利用 ItemViewType 區分普通項和頭部尾部
二、將頭部和尾部的項設置為占據整行,而不是像普通項一樣只占據一個格子
給 RecyclerView 設置 GridLayoutManager 布局管理器
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
在適配器中,利用 position 來判定每一項的類型:頭部,普通項,底部
@Override public int getItemViewType(int position) { int dataItemCount = getContentItemCount(); if (mHeaderCount != 0 && position < mHeaderCount) {//頭部View return ITEM_TYPE.ITEM_TYPE_HEADER.ordinal(); } else if (mBottomCount != 0 && position >= (mHeaderCount + dataItemCount)) {//底部View return ITEM_TYPE.ITEM_TYPE_BOTTOM.ordinal(); } else { return ITEM_TYPE.ITEM_TYPE_CONTENT.ordinal(); } }
然后對應不同類型創建不同布局
@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == ITEM_TYPE.ITEM_TYPE_HEADER.ordinal()) { return onCreateHeaderView(parent); } else if (viewType == ITEM_TYPE.ITEM_TYPE_CONTENT.ordinal()) { return onCreateContentView(parent, viewType); } else if (viewType == ITEM_TYPE.ITEM_TYPE_BOTTOM.ordinal()) { return onCreateBottomView(parent); } return null; }
此時的RecyclerView的頭部和尾部是一個跟普通子項一樣占一列的布局
接下來是最重要的部分,當item是頭部或底部時,我們
讓item占據整行
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { if (adapter.isHeaderView(position) || adapter.isBottomView(position)) { return gridLayoutManager.getSpanCount(); }else{ return 1; } } });
adapter.isHeaderView(position) 和 adapter.isBottomView(position) 的判斷跟 getItemViewType 差不多
此時就實現了頭和底部占據一行,不再接在普通item后面了