给RecyclerView添加头部和尾部最简单的实现方式

来源:互联网 发布:淘宝质量好的男装 编辑:程序博客网 时间:2024/05/22 14:15

参考:Android 优雅的为RecyclerView添加HeaderView和FooterView
其实实现的最简单的方式就是扩展一下RecyclerView.Adapter
伪代码如下:

    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)    {        if (viewType == HEADERTYPE)        {            ViewHolder holder = ViewHolder.createViewHolder(parent.getContext(), getHeaderView());            return holder;        } else if (viewType== FOOTERTYPE)        {            ViewHolder holder = ViewHolder.createViewHolder(parent.getContext(), getFooterView());            return holder;        }        return mInnerAdapter.onCreateViewHolder(parent, viewType);    }

当然还有getItemViewType方法:

    @Override    public int getItemViewType(int position)    {        if (position==。。。)        {            return HEADERTYPE;        } else if (position==。。。)        {            return FOOTERTYPE;        }        return mInnerAdapter.getItemViewType(position - getHeadersCount());    }

最后ItemCount要加上头和尾的数量

@Override    public int getItemCount()    {        return getHeadersCount() + getFootersCount() + getRealItemCount();    }

实现上面的代码运行之后你会发现线性的没有问题了,但是Grid的和瀑布流的还是有问题,只需要再重写两个方法就可以了
针对Grid的

Overridepublic void onAttachedToRecyclerView(RecyclerView recyclerView){    innerAdapter.onAttachedToRecyclerView(recyclerView);    RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();    if (layoutManager instanceof GridLayoutManager)    {        final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;        final GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup();        gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup()        {            @Override            public int getSpanSize(int position)            {               int viewType = getItemViewType(position);              if (mHeaderViews.get(viewType) != null)              {                  return layoutManager.getSpanCount();              } else if (mFootViews.get(viewType) != null)              {                  return layoutManager.getSpanCount();              }              if (oldLookup != null)                  return oldLookup.getSpanSize(position);              return 1;            }        });        gridLayoutManager.setSpanCount(gridLayoutManager.getSpanCount());    }}

针对瀑布流的

@Overridepublic void onViewAttachedToWindow(RecyclerView.ViewHolder holder){    mInnerAdapter.onViewAttachedToWindow(holder);    int position = holder.getLayoutPosition();    if (isHeaderViewPos(position) || isFooterViewPos(position))    {        ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();        if (lp != null                && lp instanceof StaggeredGridLayoutManager.LayoutParams)        {            StaggeredGridLayoutManager.LayoutParams p =                     (StaggeredGridLayoutManager.LayoutParams) lp;            p.setFullSpan(true);        }    }}

我都能看懂,基本也都能看懂,我这里就不解释了,改变一下单个item的占用的span数。

0 0