美文网首页
ListView至简

ListView至简

作者: Volodymyr | 来源:发表于2016-06-06 20:20 被阅读23次

    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-1

    4.1.2:继承EasyHolder

    代码4-2

    可以发现代码2-1中代码其实是被分布到了上面三个方法中。

    4.1.3:设置Adapter

    代码4-3

    4.1.4:运行效果

    代码4-4

    4.2栗子2(多类型)

    4.2.1:准备

    在单类型基础上新增一个布局item_child.xml,如下图,该布局和item_parent.xml唯一不同就是组件排列方向不同,其他均一样,包括id。

    item_child.xml

    新增一Bean类Child,该类继承Parent类,唯一不同就是type的值,该值用来区分ListView中item的类型:

    代码4-5

    4.2.2:继承EasyHolder,因其特殊性(符合冗余3),即唯一不同就是标记3处,所以只需重写getLayout()方法即可:

    代码4-5

    4.2.3:设置Adapter

    代码4-6

    其中getItemType具体逻辑不再赘述,getHolder只需根据type传入相应的EasyHolder即可。

    4.2.4:运行效果图

    代码4-7

    5:最后附上Demo下载地址:

    https://github.com/VolodymyrCj/workspace/tree/master/as_workspace/EasyAdapter

    相关文章

      网友评论

          本文标题:ListView至简

          本文链接:https://www.haomeiwen.com/subject/czhthttx.html