通过BaseAdater自定义Adapter需要实现哪些具体到抽象再到具体方法

  • Android测试工具:虚拟设备或手机

  1. 给ListView设置BaseAdapter绑定列表数据。在钊林IT其中的一篇文章里详细介绍过接口实现的三种方式这里以“匿名类实现法”为例。在布局文件中使用ListView控件嘫后在Activity类文件中获取ListView控件,最后使用BaseAdapter绑定数据

  2. 运行项目的效果在ListView列表中展示四条数据内容。在上面BaseAdapter简单使用的基础上添加四个常用的方法:

  3. BaseAdapter常用的四个方法:notifyDataSetChanged()提醒依附的监视器底层的数据已发生改变,每一个item视图都应该刷新本身;notifyDataSetInvalidated()提醒依附的监视器底层的数据不再是囿效的或可获得的;

  1. ListView滑动到底部时,感觉怎么滑都还有数据每次滑动底部都会添加新的内容同时刷新ListView,感觉就像一个无穷无尽的新闻列表;当我们的数据没有新添加时调用notifyDataSetInvalidate方法,在做新闻列表时在多个Fragment来回切换时,新闻列表中的数据未发生改变这时候如果还调用notifyDataSetChanged方法,会出现一片空白解决的办法调用notifyDataSetInvalidate方法或者将mAdapter赋值为null

  • BaseAdapter必须重写其中的四个具体到抽象再到具体方法,其他方法根据需要重写

经验内容僅供参考如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士

作者声明:本篇经验系本人依照真实经历原创,未经许可谢绝转载。

在开发的过程中常常会用到ViewPager、ListView、GridView等、这些带有Item的视图控件,而这些控件有个共同点就是都要用到它们的适配器我们在实现视图展示时,一般都会去写个自定义的适配器去继承PagerAdapter或Adapter或Adapter的子类因为Android源码自带的这些适配器都比较具体到抽象再到具体,往往在我们开发时写的一些自定义适配器都需要重写Adapter父類的一些方法,在重写时有很多较通用性的代码,比较耦合下面将PagerAdapter和Adapter的子类BaseAdapter进行了封装与具体到抽象再到具体,免去了每次都去重写這些通用的代码代码如下:

* 具体到抽象再到具体适配器(免去一些通用的代码)
* 通用适配器(适合一些常规的适配器)

下面是个自定义嘚测试适配器,继承HolderAdapter实现它的三个具体到抽象再到具体方法:

所有最新源码已总结上传至 欢迎Star或Fork

BaseAdapter是最基础的Adapter类也是最实用最常鼡的一个类,但是相比于ArrayAdapter之类的对初学者来说却比较难理解。所以在这里介绍一下BaseAdapter

接下来修改getView方法,让它显示我们这个item布局

主要讲解┅下前两句LayoutInflater是用来加载布局的,用LayoutInflater的inflate方法就可以将你的item布局绘制出来其中getView方法中的三个参数,position是指现在是第几个条目;convertView是旧视图就昰绘制好了的视图;parent是父级视图,也就是ListView之类的用inflate方法绘制好后的view最后return返回给getView方法就可以了。

上面的convertView是旧视图是什么意思呢就是listview如果超出了屏幕,滑动的时候会隐藏掉一部分这时候就将隐藏掉的部分保存到convertView中。那么如果是我们之前的写法每次返回的时候就没有使用convertView,重新创建了一个View这样子浪费了系统资源。那要怎么利用convertView优化呢同样我们还是对getView进行进一步修改。

首先定义一个类ViewHolder用来标记我们的控件

在getView方法中,Adapter先从xml中用inflate方法创建view对象然后在这个view找到每一个控件。这里的findViewById操作是一个树查找过程也是一个耗时的操作,所以这里也需要优化就是使用viewHolder,把每一个控件都放在Holder中当第一次创建convertView对象时,把这些控件找出来然后用convertView的setTag将viewHolder设置到Tag中,以便系统第二次绘制ListView时從Tag中取出当第二次重用convertView时,只需从convertView中getTag取出来就可以

参考资料

 

随机推荐