比较简单的内部类viewholder是比较好理解的,是在adapter中定义的一个静态内部类。
为什么是静态内部类呢?首先要说到静态内部类和非静态内部类的主要区别:非静态内部类会隐式地持有外部类的引用,而静态内部类不会。
声明ViewHolder静态内部类,可以将ViewHolder和外部类解引用。一般ViewHolder都很简单,不定义为static也没事。不过你将它定义为static的,显得更合理/更专业,这一点足够。
在项目开发中我们用的是下面的这种比较优化的ViewHolder,:
public class ViewHolder {
// I added a generic return type to reduce the casting noise in client code
@SuppressWarnings("unchecked")
public static <T extends View> T get(View convertView, int id) {
// SparseArray同HashMap<Integer,T>,是其一种优化
SparseArray<View> viewArray = (SparseArray<View>) convertView.getTag();
if (viewArray == null) {
viewArray = new SparseArray<View>();
convertView.setTag(viewArray);
}
View childView = viewArray.get(id);
if (childView == null) {
childView = convertView.findViewById(id);
// 存入view
viewArray.put(id, childView);
}
return (T) childView;
}
}