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软件编程有所帮助。