一、万用适配器简介
我们在做Android开发的时候,经常会用到ListView这个控件,我之前写过一篇文章:BaseAdapter与ListView解析。一般来说,我们都会为每一个ListView去建立一个适配器,那这样一个大型项目,不是要建立很多个适配器?!所以,为了提高代码的复用性,我们可以打造一个通用的适配器GeneralAdapter。
二、ViewHolder和GeneralAdapter的编写
一般我们编写Adapter时都会用到ViewHolder,通过convertView.setTag与convertView进行绑定,然后当convertView已经加载过时,直接从与之对于的ViewHolder(getTag)中取得convertView布局中的控件。也就是说,实际上们每个convertView会绑定一个ViewHolder对象,这个viewHolder主要用于帮convertView存储布局中的控件。所以我们只要写出一个通用的ViewHolder,然后对于任意的convertView,提供一个对象让其setTag即可;所以我们使用容器,专门存每个Item布局中的所有控件,而且还要能够查找出来;既然需要查找,那么ListView肯定是不行了,需要一个键值对进行保存,键为控件的Id,值为控件的引用,我们使用比Map效率更高的SparseArray这个类。
以下是ViewHolder类的代码,具体的解释写在代码注释里面:
/**
* Created by ZYQ on 2016/10/14.
* 一个通用的ViewHolder类
*/
public class ViewHolder {
// 使用了SparseArray<View>用于存储与之对于的convertView的所有的控件
private SparseArray<View> mViews;
private int mPosition;
private View mConvertView;
public ViewHolder(Context context, ViewGroup parent, int layoutID, int position) {
this.mPosition = position;
this.mViews = new SparseArray<View>();
mConvertView = LayoutInflater.from(context).inflate(layoutID, parent, false);
mConvertView.setTag(this);
}
// 拿到一个ViewHolder对象
public static ViewHolder get(Context context, View convertView,
ViewGroup parent, int layoutID, int position) {
if (convertView == null) {
return new ViewHolder(context, parent, layoutID, positi