給RecyclerView實現的GridView加上HeaderView和FooterView


一、利用   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后面了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM