代码改变世界

ListView卡顿问题解决思路总结

2016-09-26 10:38  百度乜搜不到  阅读(1383)  评论(0编辑  收藏  举报

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的滚动速度。

4.

listview 被多层嵌套,多次的onMessure导致卡顿,如果多层嵌套无法避免,建议把listview的高和宽设置为fill_parent. 如果是代码继承的listview,那么也请你别忘记为你的继承类添加上LayoutPrams,注意高和宽都是fill_parent的;

提醒大家的是以下两种情况也会引起ListView滑动卡顿:

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

2、如果你定义的TextView的样式过于复杂,定义太多的属性(如android:ellipsize值为marquee),在你调用setText()方法时就会花费大量的时间。

总结的网络代码: 

public class ViewHolder {

@SuppressWarnings("unchecked")
public static <T extends View> T get(View view, int id) {
  SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
  if (viewHolder == null) {
    viewHolder = new SparseArray<View>();
    view.setTag(viewHolder);
  }
  View childView = viewHolder.get(id);
  if (childView == null) {
    childView = view.findViewById(id);
    viewHolder.put(id, childView);
  }
    return (T) childView;
    }

}

使用方法:

TextView tv = ViewHolder.get(convertView, R.id.xxx);
ImageView gv = ViewHolder.get(convertView, R.id.xxx);