使用自定义的 Adapter,需要优化,说到底是优化我们自定义的适配器类,再说到底就是优化回调方法 getView 方法。
在ListView 编程: Adapter 何方神圣?博客中,只是简单的介绍了如何去自定义一个适配器以及注意事项。
但是,如果像ListView 编程: Adapter 何方神圣?中的示例代码那样去写程序的话,那么估计要被老大BS的,呵呵!
那么,结合 Google IO 的建议、APIDemo 代码以及 个人见解,作进一步的优化工作。
说明:该博客使用的布局文件与ListView 编程: Adapter 何方神圣?附录中一致。
整理代码,为优化做准备
Activity 代码
FileViewAdapter 代码
运行效果:
ok,对代码的重新整理算是为下面的优化做准备。
在接下来的优化方案里,主要是针对 FileViewAdapter 的 getView 方法进行优化,其他代码不变。
说优化之前,先搞明白一个问题:getView 方法的三个参数
getView 方法有三个参数,各个参数的含义可以咨询 SDK API 文档。修改代码(就是修改 Log 输出):
运行 APP,打印信息:
可以看出,getView 方法被调用了 16(0-15) 次,不是 30 次。
仔细看看模拟器就可以知道当前显示的 item 是 16(下面还有一个显示不全,应该是 17 个,从下面的打印信息可以看出) 个,不是 30 个。
那么,我们滑动当前视图中的滚动条,试一试。
可以看出,getView 方法确实是调用了 30 次(0-29)。
你还可以发现,(滚动)显示的打印信息中,convertView 不是 null 了。我们再次将滚动条滚动到顶部,发现打印信息中 convertView 也不是 null 了。
换句话说,我们可以利用 convertView 这个参数,而不去在 getView 方法中重新创建一个临时的变量 View 了,那么可以减轻虚拟机(回收)的负担,从而提高效率。
方案 1_ 优化代码: 使用convertView
可以看出,只有
convertView == null 为真(上面测试已经说明 convertView 何时为 null),才去创建 View 对象。
如果你有兴趣的话,可以再次运行 APP 可以看出从底部再次滚动到顶部,反复几次,你会发现几乎很少创建 View 对象,而是重复利用原来已经存在的 View 对象。
下面还有一种方式来优化代码,不说是最好但至少是 even better (Google 推荐)!
方案 2_优化代码:hold 一把
在 android 提供的 APIDemo 中(List14.java)使用了 ViewHolder ,所以 ViewHolder 不是 android 自带的 api,也不是什么诡异的东西。
其中 ViewHolder 是 FileViewAdapter 的 一个静态内部类。
使用 ViewHolder 的关键好处是缓存了显示数据的视图,加快了 UI 的响应速度。
到目前为止,仿佛优化工作已经 ok,其实还有一个小问题: ImageView 使用的图片资源需要预处理。FileViewAdapter 完整的代码如下:
恩,基本搞定。剩下的问题就是 findViewById 的问题了,留着后面讨论吧。
Google IO 文档下载:http://download.csdn.net/detail/androidbluetooth/3783925
分享到:
相关推荐
Android自定义adapter的listview代码
使用SimpleAdapter和自定义Adapter分别实现了ListView的填充,自定义的还添加了一个删除的事件。
ListView中使用自定义Adapter及时更新数据
Android listview例子, 采用自定义Adapter:包含了Button控件
listview 自定义adapter的例子demo
Android之自定义Adapter的ListView
安卓listview自定义adapter包括demo和一些其他自定义绑定的代码
C#的ListView添加各种自定义控件,CheckBox,ComboBox等
自定义适配器 和 SimpleAdater 配合listView使用 ,将数据展示在列表中 进阶2
Flutter学习之旅(六)----ListView控件自定义Adapter以及带参数跳转,博客对应地址:http://blog.csdn.net/zhangxiangliang2/article/details/76383244
根据CSDN鸿洋大神的博客自定义Adapter改写而成。可适应大多数的ListView和GridView的适配器需求~~
Android ListView 自定义adapter好友列表
ListView自定义Adapter实现多视图Item
为便于学习自定义的Adapter,本案例的界面未进行美化,功能已经实现,对于其中的getView(int position,View view ,ViewGroup vg)做了数据的填充操作。本案例功能及其简单,只涉及ListView中自定义适配器,没有对...
新手学习,listview自定义Adapter显示省名并配置item事件,通过自定义adapter显示省份,点击item用toast提示点击内容
listview自定义Adapter实现仿qq页面,内部代码有详细注释,
这个是我写的一个自定义Adapter适配器,用来绑定数据到ListView上。我写的代码非常简单易懂
简单的listview自定义适配器的使用方法,注释很清晰,也有对应的博文介绍
自定义Adapter实现多种Item视图的ListView