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<>();
publicArrayListmFooterViews=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;
privateArrayListmFootViews;
staticfinalArrayListEMPTY_INFO_LIST=
newArrayList();
privateintmCurrentPosition;
publicRecyclerWrapAdapter(ArrayListmHeaderViews,ArrayListmFootViews,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就可以添加头部和尾部了。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!