1:简介
Android开发中ListView经常会被用到,而和BaseAdapter搭配使用也是一种常用的选择。但由于重写BaseAdapter需要实现过多的抽象方法,会导致代码很长很冗余很不美观。于是自己写了个抽象类EasyAdapter继承BaseAdaper以及一个ViewHolder抽象类EasyHolder(ViewHolder相信不用解释大家也知道),两个类搭配使用以尽可能的减少代码的重复。
2:以前怎么写
让我们先看一下最原始的ListView加BaseAdapter的写法:
代码2-1我们来看一下,哪些代码是冗余的,即不需要每次都写。
1:首先是BaseAdapter的三个抽象方法getCount(),getItem(),getItemId(),一般情况下他们的逻辑没什么多大变动,所以可以认为是冗余的。
2:考虑一种情况,有两个页面均使用ListView,且item布局可以共用。如果重写一遍上面代码就太烦了,两者唯一不同也就是标记1部分的代码,即更新显示内容的代码。所以可以认为在此情况下标记2和标记3处代码冗余。
3:再考虑一种情况,这种情况可能用到比较少。还是有两个页面均使用ListView,且两者item布局唯一不同之处就是组件布局不同,其他均一样(包括组件个数,组件id以及标记1代码部分逻辑),此时如果重新写一个BaseAdapter就更吃亏了,因为唯一不同之处就是标记3处一行代码,连标记2处代码两者都是一样的,因为刚才说了组件个数和id都一样。所以可以进一步认为在此情况下标记2处冗余和标记3处冗余可以进一步细分。
3:现在怎么写
我新建了一个抽象类EasyHolder和一个继承BaseAdapter的抽象类EasyAdapter,下面将从上述三个冗余点着手分析这两个类。
3.1:EasyHolder类
1:针对冗余1,实现getCount(),getItem(),getItemId()的默认逻辑即可
2:针对冗余2和冗余3,我创建了一个EasyHolder抽象类,代码如下:
代码3-1该类设有三个抽象方法,分别对应代码2-1中的三个标记点。标记3处代码对应getLayout()方法,标记2处代码对应createView()方法,标记3处代码对应refreshView()方法。
3.2:EasyAdapter代码如下:
代码3-2该类提供了冗余1的默认实现。用户只需实现getHolder()这一抽象方法即可,其中type可用于ListView多类型时使用,单类型可忽略。
4:举个栗子
4.1:栗子1(单类型)
4.1.1:准备
ListView的item布局item_person.xml如下,设有两个TextView:
item_person.xml设置一Bean类Person,设有三个属性name、sex和type,其中name和sex对应item_person.xml中两个TextView的显示内容,type将在下面第二个例子ListView多类型处使用:
代码4-14.1.2:继承EasyHolder
代码4-2可以发现代码2-1中代码其实是被分布到了上面三个方法中。
4.1.3:设置Adapter
代码4-34.1.4:运行效果
代码4-44.2栗子2(多类型)
4.2.1:准备
在单类型基础上新增一个布局item_child.xml,如下图,该布局和item_parent.xml唯一不同就是组件排列方向不同,其他均一样,包括id。
item_child.xml新增一Bean类Child,该类继承Parent类,唯一不同就是type的值,该值用来区分ListView中item的类型:
代码4-54.2.2:继承EasyHolder,因其特殊性(符合冗余3),即唯一不同就是标记3处,所以只需重写getLayout()方法即可:
代码4-54.2.3:设置Adapter
代码4-6其中getItemType具体逻辑不再赘述,getHolder只需根据type传入相应的EasyHolder即可。
4.2.4:运行效果图
代码4-75:最后附上Demo下载地址:
https://github.com/VolodymyrCj/workspace/tree/master/as_workspace/EasyAdapter。
网友评论