Android之ListView性能优化

来源:互联网 发布:c语言高级编程 pdf 编辑:程序博客网 时间:2024/04/27 16:23

好久没搞博客了 最近一直在搞公司的jenkins,今天看了一下listview的优化,转载一下,经常更新

以下是转载:

ListView滚动速度优化主要可以应用以下几点方法来实现:

1、使用Adapter提供的convertView

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

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

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

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

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

以上的3种方法网上都有相应实现的例子,我这里不在赘述,提醒大家的是以下两种情况也会引起ListView滑动卡顿:

1、同步显示网络图片,或用弱引用的HashMap存储网络图片

2、非常蛋疼的情况,也是引起我写这篇文档主要原因,如果你定义的TextView的样式过于复杂,定义太多的属性(如android:ellipsize值为marquee),在你调用setText()方法时就会花费大量的时间。

附送一个ViewHolder简化代码

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class ViewHolder {  
  2.       
  3.     @SuppressWarnings("unchecked")    
  4.     public static <T extends View> T get(View view, int id) {    
  5.         SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();    
  6.         if (viewHolder == null) {  
  7.             viewHolder = new SparseArray<View>();    
  8.             view.setTag(viewHolder);    
  9.         }  
  10.         View childView = viewHolder.get(id);    
  11.         if (childView == null) {    
  12.             childView = view.findViewById(id);    
  13.             viewHolder.put(id, childView);    
  14.         }    
  15.         return (T) childView;    
  16.     }   
  17.       
  18. }  

使用举例

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. TextView tv = ViewHolder.get(convertView, R.id.xxx);  
  2. GridView gv = ViewHolder.get(convertView, R.id.xxx);  
  3. ... 

0 0