Android RecyclerView添加头部和底部的方法
如果只是想添加头部,可是使用GitHub里面这个项目,它可以为LinearLayoutManager,GridLayoutManager,StaggeredGridLayoutManager布局的RecyclerView添加header。使用起来也十分简单;
只需将RecyclerViewHeader布局放在RecyclerView的上层。
<FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal|top"/> <com.bartoszlipinski.recyclerviewheader.RecyclerViewHeader android:id="@+id/header" android:layout_width="match_parent" android:layout_height="100dp" android:layout_gravity="center_horizontal|top"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="header"/> </com.bartoszlipinski.recyclerviewheader.RecyclerViewHeader> </FrameLayout>
然后获得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{ publicArrayList<View>mHeaderViews=newArrayList<>(); publicArrayList<View>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; privateArrayList<View>mHeaderViews; privateArrayList<View>mFootViews; staticfinalArrayList<View>EMPTY_INFO_LIST= newArrayList<View>(); privateintmCurrentPosition; publicRecyclerWrapAdapter(ArrayList<View>mHeaderViews,ArrayList<View>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<numHeaders){ return; } intadjPosition=position-numHeaders; intadapterCount=0; if(mAdapter!=null){ adapterCount=mAdapter.getItemCount(); if(adjPosition<adapterCount){ mAdapter.onBindViewHolder(holder,adjPosition); return; } } } @Override publicintgetItemCount(){ if(mAdapter!=null){ returngetHeadersCount()+getFootersCount()+mAdapter.getItemCount(); }else{ returngetHeadersCount()+getFootersCount(); } } @Override publicRecyclerView.AdaptergetWrappedAdapter(){ returnmAdapter; } @Override publicintgetItemViewType(intposition){ //增加两个类型 //RecyclerView.INVALID_TYPE添加头部 //RecyclerView.INVALID_TYPE-1添加尾部 //如果头部不为空,那么我们就要先添加头部,所以我们只要 //把前面几个position给头部,当position小于头部总数的时候, //我们返回头部类型。再判断原Adapter的count与当前position //的差值来比较,是调用原Adapter的类型,还是获取footView //的类型。 mCurrentPosition=position; intnumHeaders=getHeadersCount(); if(position<numHeaders){ returnRecyclerView.INVALID_TYPE; } intadjPosition=position-numHeaders; intadapterCount=0; if(mAdapter!=null){ adapterCount=mAdapter.getItemCount(); if(adjPosition<adapterCount){ returnmAdapter.getItemViewType(adjPosition); } } returnRecyclerView.INVALID_TYPE-1; } privatestaticclassHeaderViewHolderextendsRecyclerView.ViewHolder{ publicHeaderViewHolder(ViewitemView){ super(itemView); } } }
我们还可以实现一个接口,来调用RecyclerWrapAdapter对象:
publicinterfaceWrapperAdapter{ publicRecyclerView.AdaptergetWrappedAdapter(); }
这样我们就可以把RecyclerView布局改成WrapRecyclerView就可以了,然后调用addHeaderView或者addFooterView就可以添加头部和尾部了。
以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。