1、利用 ItemViewType 区分普通项和头部尾部ide
2、将头部和尾部的项设置为占据整行,而不是像普通项同样只占据一个格子布局
给 RecyclerView 设置 GridLayoutManager 布局管理器this
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
在适配器中,利用 position 来断定每一项的类型:头部,普通项,底部spa
@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(); } }
而后对应不一样类型建立不一样布局code
@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; }
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 差很少blog
此时就实现了头和底部占据一行,再也不接在普通item后面了get