RecyclerView封装Adapter之添加头部和底部视图
转载请标明出处:
http://blog.csdn.net/lisdye2/article/details/52674879
本文出自:【Alex_MaHao的博客】
项目中的源码已经共享到github,有需要者请移步【Alex_MaHao的github】
在ListView
中已经自带了添加头布局和添加底部布局的方法,但是在RecyclerView
中,却没有默认实现,这导致在实现一些特殊布局中不是那么的方便,本篇博客将通过封装Adapter
方式添加头部和底部布局。
首先看一下实现效果
在阅读本篇博客之前,推荐阅读上一篇博客 RecyclerView 封装Adapter之BaseRecyclerAdapter
理论分析
在实现的过程中,我们首先想到的便是复用的问题,如果对于ListView
和RecylerView
掌握的还可的话,知道在一个条目显示时候,会复用之前已经隐藏的条目。如果添加头部或者底部的视图,他的样式肯定适合我们普通显示的条目是不同的,这时候,复用势必会抛出错误,那么如何解决呢?
细心的同学会发现,在创建RecyclerView.Adapter
时,其中的一个方法有些特别public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
,第一个参数是父控件,第二个参数,从参数的命名山可以理解为视图的类型,关键便就在此,我们可以根据viewType
的值不同,构造不同的ViewHoder
。 既然能够获取,肯定有指定的地方,继续寻找,发现了下面的方法public int getItemViewType(int position)
,根据索引值返回对应条目的类型。那么,一切都捋顺了。思路如下:
- 根据
public int getItemViewType(int position)
,定义头部,底部,正常条目的常量,根据索引值进行返回。 - 在
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
中,通过viewType
的不同值创建不同的ViewHolder
.
代码实现
定义变量,添加头部布局和底部布局
首先,从简单的开始实现,如下
public abstract class BaseRecycleAdapter<T> extends RecyclerView.Adapter<BaseRecycleAdapter.BaseViewHolder> {
// 头部控件
private View mHeaderView;
// 底部控件
private View mFooterView;
private boolean isHasHeader = false;
private boolean isHasFooter = false;
/**
* 添加头部视图
* @param header
*/
public void setHeaderView(View header){
this.mHeaderView = header;
isHasHeader = true;
notifyDataSetChanged();
}
/**
* 添加底部视图
* @param footer
*/
public void setFooterView(View footer){
this.mFooterView = footer;
isHasFooter = true;
notifyDataSetChanged();
}
}
上面的代码都很简单,设置头部和底部布局,修改对应的标志。
定义不同的视图类型,用以确定viewType的值
// item 的三种类型
public static final int ITEM_TYPE_NORMAL = 0X1111; // 正常的item类型
public static final int ITEM_TYPE_HEADER = 0X1112; // header
public