浅谈 Android 之 listView 性能优化 (一)

来源:互联网 发布:如何优化伊春发展环境 编辑:程序博客网 时间:2024/06/16 02:42

ListView 和 Adapter 

一、工作原理:

1、ListView 针对 List 中每个 item , 要求 adapter 给一个视图(getView);

2、一个新的视图被返回并显示。


二、ListView 滑动时的 速度优化 主要可以使用以下三个方法实现:

核心思想:复用!

1、使用Adapter提供的convertView

convertView 是 Adapter 提供的视图缓存机制,当第一次显示数据的时候,adapter会创建n个(n等于页面可见的item的数目)convertView,当下次需要显示新的 item 的时候,adapter 会复用这些已经创建的 convertView,减少再次创建 convertView 所带来的开销,从而达到性能的提升。

实际上Android为你缓存了视图。Android中有个叫做Recycler的构件,下图是他的工作原理:


  1. 如果你有10亿个条目(item),其中只有可见的条目存在内存中,其他的在Recycler中。
  2. ListView 先请求一个 type1 视图(getView) 然后请求其他可见的条目。convertView 在 getView 中是空(null)的。
  3. 当 item1 滚出屏幕,并且一个新的条目从屏幕低端上来时,ListView 再请求一个 type1 视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回 convertView,不必重新创建一个视图。

详细的示例代码 及 输出打印日志 请见 http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html


2、使用自定义的视图缓存类

自定义一个视图缓存类,在这个类中保存我们在item中使用到的视图的引用,通过convertView的setTag方法和getTag方法来存储这个视图缓存类引用和重新获取这个视图缓存类引用,其目的也是为了减少重复创建视图时的开销。

下面我介绍三种方式,但其原理都一样。只展示 getView()方法。

第一种: 

 写一个内部类 ViewHolder , 将 Item 中需要获取的控件,在 ViewHolder 类中声明;然后在 getView() 方法中,实例化一个 ViewHolder 对象——holder ,;holder 就像是一个管家,我们获取 item 中的控件时,都要和这个管家交涉,通过这个管家来获取控件;

不要忘记最关键的一步:  convertView.setTag(holder);和 holder = (ViewHolder) convertView.getTag();




第二种:

用一个 map 集合来存储 相应 position 的 item 视图;

最关键的不要忘了:viewMap.put(position,convertView);




第三种:

写一个ViewHolder 工具类,使用方便更方便;





在 adapter 的 getView() 中 使用代码示例:

TextView tv_describe = ViewHolder.get(convertView, R.id.tv_describeId);TextView tv_date = ViewHolder.get(convertView, R.id.tv_dateId);tv_subject.setText(list.get(position).getTitle());tv_describe.setText(list.get(position).getDescription());




3、减少不必要的视图更新

ListView 在滚动时会请求重新获取 item ,来显示不同内容的item,而如果在获取 item 时比较耗时就会造成在滚动时出现卡顿的现象。那我们可以通过监听 ListView 的滚动事件来使 ListView 处于不同的滚动状态时做不同的事情,比如在 ListView 处于滚动过程中加载少量的显示数据,当ListView 处于空闲的状态时再加载所有的数据,这样就可以减少 ListView 在滚动过程中的开销,从而提供 ListView 的滚动速度。




3 0
原创粉丝点击