如何写一个通用的RecyclerView.adapter
项目源码地址:https://github.com/jiang111/SuperRecyclerViewAdapter
欢迎star和fork
随着需求的不断修改,在项目中越来越流行使用recyclerview。
那么如何构建出一个通用的adapter来提高我们的快速开发能力。
下面我们就来看看如何构建出一个完善的baseadapter。
1.分析
想要构建出一个很nice的adapter,那你必须得熟悉recyclerview.adapter的执行流程,以及一些常用的方法吧。 通过分析,我们知道adapter中几个主要的方法。
*1. onCreateViewHolder() //用来创建一个viewholder(viewholder必须继承recyclerview.viewholder)
*2. onBindViewHolder() //用来根据当前item的位置进行数据绑定。
*3. getItemViewType() //返回你当前的adapter里有几种item
*4. getItemCount() //返回item的总个数
*5. 还有就是ViewHolder这个类 ,这个类主要用于拿到item中的相关控件
2.实战
既然 viewholder的作用主要是拿到item中相关控件, 那我们完全可以写一个通用的viewholder然后提供一个getview()的方法,让adapter去拿相应的view.进行设置值。
看代码
public class BaseViewHolder extends RecyclerView.ViewHolder {
protected final SparseArray<View> mViews;
protected View mConvertView;
public BaseViewHolder(View itemView) {
super(itemView);
mViews = new SparseArray<>();
mConvertView = itemView;
}
/**
* 通过控件的Id获取对应的控件,如果没有则加入mViews,则从item根控件中查找并保存到mViews中
*
* @param viewId
* @return
*/
public <T extends View> T getView(@IdRes int viewId) {
View view = mViews.get(viewId);
if (view == null) {
view = mConvertView.findViewById(viewId);
mViews.put(viewId, view);
}
return (T) view;
}
public View getmConvertView() {
return mConvertView;
}
}
下面我们的adapter只需要使用BaseViewHolder,就可以了, 不需要在新建viewholder了。
public abstract class BaseAdapter<M> extends RecyclerView.Adapter<BaseViewHolder> {
protected List<M> mLists;
protected Context mContext;
protected int layoutID;
public<