RecyclerView添加头部和尾部

为RecyclerView添加头部和底部

第一步1

需要定义一个Adapter,继承自RecyclerView.Adapter

HeaderAndFooterWrapper<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder>

第二步2

在Adapter的构造方法中传入一个Adapter对象用于添加除头部尾部以外的item,并生命所需要用的成员变量

private static final int BASE_ITEM_TYPE_HEADER = 10000;
    private static final int BASE_ITEM_TYPE_FOOTER = 20000;

    private SparseArrayCompat<View> mHeaderViews = new SparseArrayCompat<>();
    private SparseArrayCompat<View> mFootViews = new SparseArrayCompat<>();

    private RecyclerView.Adapter mInnerAdapter;

    public HeaderAndFooterWrapper(RecyclerView.Adapter mInnerAdapter) {
        this.mInnerAdapter = mInnerAdapter;
    }
    public boolean isHeaderViewPos(int position){
        return position < getHeadersCount();
    }

第三步3

需要有添加头部和尾部的方法,以及判断当前item是否是头部和尾部视图

public boolean isFooterViewPos(int position){
        return position >= getHeadersCount() + getRealItemCount();
    }

    public void addHeaderView(View view){
        mHeaderViews.put(mHeaderViews.size() + BASE_ITEM_TYPE_HEADER,view);
    }

    public void addFooterView(View view){
        mFootViews.put(mFootViews.size() + BASE_ITEM_TYPE_FOOTER,view);
    }

第四步4

添加获取每一种item数量的方法,比如header视图数量或者footer视图数量

  private int getRealItemCount() {
        return mInnerAdapter.getItemCount();
    }

    private int getHeadersCount() {
        return mHeaderViews.size();
    }
    private int getFootersCount() {
        return mFootViews.size();
    }
     @Override
    public int getItemCount() {

        return getHeadersCount() + getRealItemCount() + getFootersCount();
    }

第五步5

复写getItemViewType方法,在该方法中判断如果是头部或者尾部视图就返回其在
private SparseArrayCompat mHeaderViews = new SparseArrayCompat<>();
private SparseArrayCompat mFootViews = new SparseArrayCompat<>();中的下标,以便获取

@Override
    public int getItemViewType(int position) {
        if(isHeaderViewPos(position)){
            return mHeaderViews.keyAt(position);
        }else if(isFooterViewPos(position)){
            //如果当前是footerview 就计算出其在footerViews中的下标位置
            return mFootViews.keyAt(position - getHeadersCount() - getRealItemCount());
        }
        return mInnerAdapter.getItemViewType(position - getHeadersCount());
    }

第六步6

复写onCreateViewHolder方法,和onBindViewHolder方法

 @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if(mHeaderViews.get(viewType) != null){
            ViewHolder vh = ViewHolder.crateViewHolder(parent.getContext(),
                    mHeaderViews.get(viewType));
            return vh;
        }else if(mFootViews.get(viewType) != null){
            ViewHolder vh = ViewHolder.crateViewHolder(parent.getContext(),
                    mFootViews.get(viewType));
            return vh;
        }

        return mInnerAdapter.onCreateViewHolder(parent,viewType);
    }


    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if(isHeaderViewPos(position)){
            return;
        }else if(isFooterViewPos(position)){
            return;
        }
        mInnerAdapter.onBindViewHolder(holder,position - getHeadersCount());
    }

到此已经完成了添加头部的基本代码,但是如果需要在宫格布局下head依然占据一行的话需要添加一下代码

复写onAttachedToRecyclerView方法,在该方法中判断是否是GridLayoutManger,getSpanCount意思在构造GridLayoutManger的时候所传入的每行item数量,返回值的意思就是代表当前view所需要占据多少个item

 @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        mInnerAdapter.onAttachedToRecyclerView(recyclerView);
        final RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
        if(layoutManager instanceof GridLayoutManager){

            final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
            gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    int viewType = getItemViewType(position);
                    if(mHeaderViews.get(viewType) != null){
                        return ((GridLayoutManager) layoutManager).getSpanCount();
                    }else if(mFootViews.get(viewType) != null){
                        return ((GridLayoutManager) layoutManager).getSpanCount();
                    }
                    return 1;
                }
            });
            gridLayoutManager.setSpanCount(gridLayoutManager.getSpanCount());
        }
    }

本片文章参考自,仅仅用于个人学习笔记所用不喜勿喷
代码github地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值