相信大家在很多时候都会用到ListView这个控件,因为确实是用的很多很多,但是有木有遇到过当数据很多很多的时候,往下滑ListView时有时候会卡顿,这就需要我们来优化它了。



ListView优化主要有下面几个方面:

1、convertView重用

2、ViewHolder的子View复用

3、缓存数据复用

一、convertView重用

首先讲下ListView的原理:ListView中的每一个Item显示都需要Adapter调用一次getView()的方法,这个方法会传入一个convertView的参数,这个方法返回的View就是这个Item显示的View。如果当Item的数量足够大,再为每一个Item都创建一个View对象,必将占用很多内存空间,即创建View对象(mInflater.inflate(R.layout.lv_item,
null);从xml中生成View,这是属于IO操作)是耗时操作,所以必将影响性能。Android提供了一个叫做Recycler(反复循环)的构件,就是当ListView的Item从滚出屏幕视角之外,对应Item的View会被缓存到Recycler中,相应的会从生成一个Item,而此时调用的getView中的convertView参数就是滚出屏幕的缓存Item的View,所以说如果能重用这个convertView,就会大大改善性能。

那么,我们怎么重用它呢?贴代码:



如图,当这个convertView不存在时,即第一次使用它,我们就创建一个item布局的View对象并赋给convertView,以后使用convertView时,只需从convertView中getTag取出来就可以,不需要再次创建item的布局对象了,这样便提高了性能。

二、使用ViewHolder重用

我们都知道在getView()方法中的操作是这样的:先从xml中创建view对象(inflate操作,我们采用了重用convertView方法优化),然后在这个view去findViewById,找到每一个item的子View的控件对象,如:ImageView、TextView等。这里的findViewById操作是一个树查找过程,也是一个耗时的操作,所以这里也需要优化,就是使用ViewHolder,把每一个item的子View控件对象都放在Holder中,当第一次创建convertView对象时,便把这些item的子View控件对象findViewById实例化出来并保存到ViewHolder对象中。然后用convertView的setTag将viewHolder对象设置到Tag中,
当以后加载ListView的item时便可以直接从Tag中取出复用ViewHolder对象中的,不需要再findViewById找item的子控件对象了。这样便大大提高了性能。

贴个完整的代码:





好了,ListView性能优化就说到这了,转载请注明出处——http://blog.csdn.net/u010687392





最新文章

  1. 浅谈命令查询职责分离(CQRS)模式
  2. JAVA JVM虚拟机选项:Xms Xmx PermSize MaxPermSize 区别
  3. JavaScript—之对象参数的引用传递
  4. 【bzoj2242】 SDOI2011—计算器
  5. Android中RelativeLayout属性详细说明
  6. Hay Points
  7. mysql_convert_table_format 批量修改表引擎
  8. sort uniq妙用
  9. 关于excel的导入导出
  10. Cisco 关闭命令同步提示信息
  11. 网络学习day03_IP地址概述与应用
  12. Android系统应用Mms之短信会话列表加载流程一
  13. js导出Excel表格
  14. 洛谷P2918 [USACO08NOV]买干草(一道完全背包模板题)
  15. java double 保留x位小数
  16. C#读取excel文件提示未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序
  17. 【javascript/PHP】当一个JavaScripter初次进入PHP的世界,他将看到这样的风景
  18. FTP服务器原理(转)
  19. JavaScript 作用域和闭包——另一个角度:扩展你对作用域和闭包的认识【翻译+整理】
  20. Oracle 12C -- temporal validity

热门文章

  1. bzoj5055 膜法师
  2. 2015 多校联赛 ——HDU5389(dp)
  3. [bzoj4893]项链分赃
  4. FJOI2017 RP++
  5. SpringCloud学习之快速搭建分布式配置
  6. springboot由于mysql表类型导致的 setRollbackOnly() 事务不回滚
  7. PLSQL(2)
  8. Tomcat常用参数的配置
  9. python学习之路网络编程篇(第二篇)
  10. delphi 组件安装教程详解