RecyclerView 封装Adapter之BaseRecyclerAdapter
转载请标明出处:
http://blog.csdn.net/lisdye2/article/details/52673428
本文出自:【Alex_MaHao的博客】
项目中的源码已经共享到github,有需要者请移步【Alex_MaHao的github】
封装BaseRecyclerAdapter
对于ListView
,提到最多的便是性能优化,及封装ViewHolder
和重用View
,Android推出RecyclerView
用以替代ListView
,RecyclerView
的优点便是替我们做了性能优化,不过在实际使用中,为了减少代码量,往往封装一个Adapter
的基类,以达到复用的目的。
理论分析
首先,从一个最基本的Adapter
来说,不确定的只有四个个地方
- 具体数据源的类型。
在Adapter
中,往往需要保存一个数据的List
集合,以便获取数据,对不同的item
条目进行设置,而对于数据源,我们可以明确他是一个List
集合(一般来说),此时我们可以定义泛型以表示具体的数据源类型。
itemView
的布局文件。
因为每一个RecyclerView
所对应的条目的布局文件都不一样,我们可以通过构造方法让子类传过来。但我选择采用抽象方法的方式,使子类实现抽象方法,返回具体的布局。
ViewHolder
类,具体视图上的控件,用以和数据进行绑定和显示。
虽然,RecyclerView
帮我们做了性能优化,但是我们仍然需要编写ViewHolder
类继承RecyclerView.ViewHolder
,如果我们每写一个Adapter
都需要定义一个ViewHolder
,那么代码量将会增加很多,我们可以通过在ViewHolder
中定义一个Map
集合,保存具体的id
和View
,代表键值对象。
- 将数据源和视图绑定。
对于具体的数据绑定,我们只需要具体的某一个数据和对应的条目数,此时通过定义抽象方法,交给子类去实现。
代码实现
根据上面的分析,进行对应的实现。
首先是数据源
通过泛型定义数据的类型,通过构造方法让子类传入。
public abstract class BaseRecycleAdapter<T> extends RecyclerView.Adapter<BaseRecycleAdapter.BaseViewHolder> {
// 数据源
protected List<T> datas;
// 构造方法,传入
public BaseRecycleAdapter(List<T> datas) {
this.datas = datas;
}
}
定义基类的ViewHolder
通过Map
保存基本的键值对。
/**
* 封装ViewHolder ,子类可以直接使用
*/
public class BaseViewHolder extends RecyclerView.ViewHolder{
private