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);