前言
- 上一篇文章介绍了如何进行分类适配,虽然比较完美的实现了分类适配以及复用,但是代码相当繁琐,我们有两种类型时已经出现了多层if嵌套,如果有三四种类型,估计自己都要转晕了,而且就像我们对单类型适配器抽象时做的,避免重复代码!如
果没看过上一篇,建议浏览一下,这里写的很多都是基于第一篇的。
抽象ViewHolder
1 | public static class MultiViewHolder extends ViewHolder{ |
使用接口获取对象的类型
- 我们在分类适配的时候不可避免的要获得数据的对象,以此作为根据装载不同的布局文件.
1 | /** |
抽象分类适配器
我们需要避免在子类中避免重复编码,同时在子类实现自己的方法,使用抽象父类。
我们不了解传递进来的数据是什么类型,使用泛型。
我们需要限制传进来的数据必须实现获得获得子类的方法,所以必须要求数据实现MultiEasyAdapterInterface接口,使用泛型限定符确定上限。
1 | public abstract class MultiEasyAdapter<T extends MultiEasyAdapterInterface> |
成员变量
1 | private LayoutInflater layoutInflater; |
分析一下其他成员,根据上一篇传统分类适配的写法,我们姑且忽略类型的差异
- 每个类型需要一个布局资源文件id
- 每个类型布局文件中字UI控件的个数(用来优化)
- 每个类型一个唯一的键值(用来解决复用Item空指针的问题)
- 我们用一个实体类存储这些信息
1 | ** |
- 可能有点繁琐,type和viewCount 可以省略掉,加入type是为了更灵活的获得数据类型,viewCount则是为了优化SparseArray,综上第三个成员变量,就是使用type作为键,MultiEasyAdapterEntity作为值的一个SparseArray,他的作用就是存储不同类型的数据适配时需要的配置信息,有点类似配置文件的意思。
1 | private SparseArray<MultiEasyAdapterEntity> Res4Type; |
完善代码
- 结合分类适配的方法,变量我们已经存储到了SparseArray中,所以代码就很清晰了
1 | /** |
测试
1 | listview = (ListView) findViewById(R.id.listview); |
效果
- 大家可以看到三中布局适配的没有问题,只有蓝色背景的布局显示了type,他是类型3的数据