Android RecyclerView添加头部和底部实例详解
AndroidRecyclerView添加头部和底部实例详解
如果只是想添加头部,可是使用GitHub里面这个项目,它可以为LinearLayoutManager,GridLayoutManager,StaggeredGridLayoutManager布局的RecyclerView添加header。使用起来也十分简单;
只需将RecyclerViewHeader布局放在RecyclerView的上层。
然后获得RecyclerViewHeader对象:
RecyclerViewHeaderheader=(RecyclerViewHeader)findViewById(R.id.header);
把RecyclerViewHeader赋予RecyclerView
RecyclerViewrecyclerView=(RecyclerView)findViewById(R.id.recycler_view); //setLayoutManagerforyourRecyclerView header.attachTo(recyclerView,true);
注意事项
RecyclerViewHeader必须在RecyclerView设置了LayoutManager之后调用。
目前该库适用于LinearLayoutManager,StaggeredGridLayoutManager和GridLayoutManager布局的RecyclerViews。只支持垂直布局LayoutManager。如果你打算在RecyclerView中使用setOnScrollListener(…)方法,确保在setOnScrollListener(…)的attachTo(…)方法之前使用。
当然我们也可以自己写一个添加头部和底部的RecyclerView。它实现的基本原理也是通过getItemViewType方法返回不同的类型来添加头部和底部。
首先我们自定义一个RecyclerView:
publicclassWrapRecyclerViewextendsRecyclerView{ publicArrayListmHeaderViews=newArrayList<>(); publicArrayList mFooterViews=newArrayList<>(); //添加Adapter publicAdaptermAdapter; publicWrapRecyclerView(Contextcontext,AttributeSetattrs,intdefStyle){ super(context,attrs,defStyle); } publicWrapRecyclerView(Contextcontext,AttributeSetattrs){ super(context,attrs); } publicWrapRecyclerView(Contextcontext){ super(context); } publicvoidaddHeaderView(Viewview){ mHeaderViews.clear(); mHeaderViews.add(view); if(mAdapter!=null){ if(!(mAdapterinstanceofRecyclerWrapAdapter)){ mAdapter=newRecyclerWrapAdapter(mHeaderViews,mFooterViews,mAdapter); } } } publicvoidaddFooterView(Viewview){ mFooterViews.clear(); mFooterViews.add(view); if(mAdapter!=null){ if(!(mAdapterinstanceofRecyclerWrapAdapter)){ mAdapter=newRecyclerWrapAdapter(mHeaderViews,mFooterViews,mAdapter); } } } publicvoidsetAdapter(Adapteradapter){ if(mHeaderViews.isEmpty()&&mFooterViews.isEmpty()){ super.setAdapter(adapter); }else{ adapter=newRecyclerWrapAdapter(mHeaderViews,mFooterViews,adapter); super.setAdapter(adapter); } mAdapter=adapter; } }
我们会看到我们有一个RecyclerWrapAdapter没有实现,下面我们就来看下RecyclerWrapAdapter,这个也是实现添加头部和尾部的关键。
publicclassRecyclerWrapAdapterextendsRecyclerView.AdapterimplementsWrapperAdapter{ privateRecyclerView.AdaptermAdapter; privateArrayListmHeaderViews; privateArrayList mFootViews; staticfinalArrayList EMPTY_INFO_LIST= newArrayList (); privateintmCurrentPosition; publicRecyclerWrapAdapter(ArrayList mHeaderViews,ArrayList mFootViews,RecyclerView.AdaptermAdapter){ this.mAdapter=mAdapter; if(mHeaderViews==null){ this.mHeaderViews=EMPTY_INFO_LIST; }else{ this.mHeaderViews=mHeaderViews; } if(mFootViews==null){ this.mFootViews=EMPTY_INFO_LIST; }else{ this.mFootViews=mFootViews; } } publicintgetHeadersCount(){ returnmHeaderViews.size(); } publicintgetFootersCount(){ returnmFootViews.size(); } @Override publicRecyclerView.ViewHolderonCreateViewHolder(ViewGroupparent,intviewType){ if(viewType==RecyclerView.INVALID_TYPE){ returnnewHeaderViewHolder(mHeaderViews.get(0)); }elseif(viewType==RecyclerView.INVALID_TYPE-1){ returnnewHeaderViewHolder(mFootViews.get(0)); } returnmAdapter.onCreateViewHolder(parent,viewType); } @Override publicvoidonBindViewHolder(RecyclerView.ViewHolderholder,intposition){ //如果头部不为空,那么我们就要先添加头部,所以我们只要 //把前面几个position给头部,当position小于头部总数的时候, //我们返回头部view。再判断原Adapter的count与当前position //的差值来比较,是调用原Adapter的getView方法,还是获取footView //的view。 intnumHeaders=getHeadersCount(); if(position 我们还可以实现一个接口,来调用RecyclerWrapAdapter对象:
publicinterfaceWrapperAdapter{ publicRecyclerView.AdaptergetWrappedAdapter(); }这样我们就可以把RecyclerView布局改成WrapRecyclerView就可以了,然后调用addHeaderView或者addFooterView就可以添加头部和尾部了。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!