• Android之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简化代码

    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);
    GridView gv = ViewHolder.get(convertView, R.id.xxx);
    ...
  • 相关阅读:
    igraph——图挖掘助力社会网络分析
    python杀死线程
    深入浅出Node.js(四):Node.js的事件机制
    VS.NET调试问题
    Web服务器Tomcat JDK环境变量设置DOS BAT批处理脚本 陈光剑
    sp_help
    JadePool应用范例:查询与分页
    事关就业,我是否应该诚实?
    Linux SWAP 交换分区配置说明
    对学习数据结构的建议
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/5229356.html
Copyright © 2020-2023  润新知