前言
- 介绍一下适配器的抽象,在我们做项目的时候会有很多很多地方使用ListView,也就意味着需要写很多很多的适配器,当我们写的项目很大时就会很烦很烦,每次都要写同样的代码片实现类似的功能,所以我们就有必要对传统的适配器抽象一下。
传统适配器的优化写法
- 核心代码就是getVIew()方法,在里面我们进行Item的复用,而相对于其他方法就会显得很多余,因为每个适配器都在重复相同的代码
1 | public class FirstpageGridAdapter extends BaseAdapter { |
抽象ViewHolder
- 我们可以分析一下ViewHolder类,它维护一个Item的一组UI组件,如果我们要使用使用通用的ViewHolder就会遇到一个问题,你不知道不同的布局有什么组件在里面,如何维护一组UI呢,数组?链表?或者Map?当查找View时我们使用id来进行查找,那么想在ViewHolder中查找View就需要使用id作为键,我们选择使用SparseArray,也就是稀疏数组,什么是稀疏数组,使用id(大整数)作为键值存储数据会造成大多数的未被使用,如果使用一般的表存储会造成很大的浪费,稀疏数组对数组进行了压缩,节约了很大空间,详见这里
1 | private SparseArray<View> cacheViews; |
- 使用稀疏数组存储UI控件以后我们需要一个获取UI控件的方法,方法很清晰的,itemView是传递进来的父控件,就是convertView从中根据id获取控件
1 | @Override |
- ViewHolder完整代码,这里传入了一个viewCount,为什么呢?就像ArrayList一样,不定义空间大小时初始容量16,超出空间大小时每次增加25,但就是初始容量的16对于我们来说已经是浪费了,一个Item不可能有16个控件那么多。指定大小提高内存使用。
1 | /** |
抽象适配器
- 传统的适配器有太多的重复代码需要编写,我们可以把重复的代码在父类中编写好,使得子类可以直接复用,!使用抽象父类
- 父类的getView()方法中使用了一个抽象方法,使用了一个设计模式模板方法模式,将方法的实现推迟到了子类中
- 泛型,传递的数据类型是不确定的,使用泛型可以解决这个问题,泛型的使用不了解的建议搜一下,后面深入的介绍会使用更复杂的泛型
1 | /** |
完整代码
1 |
|
测试
1 | listview = (ListView) findViewById(R.id.listview); |
效果
- 可以看到我们只用了很少的代码就完成了功能,而且很清晰,简单地适配不需要创建适配器类了,使用匿名的也很快就可以实现。演示有点丑,基本都实现了。
总结
- 将适配器抽象出来作为一个类库,再使用的时候就会简单很多很多,当然如果你的适配器数据很复杂,那么也可以继承抽象父类生成自己的类。!