zoukankan      html  css  js  c++  java
  • listview加载性能优化ViewHolder

    在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局,

    但当listview有大量的数据需要加载的时候,会占据大量内存,影响性能,这时候就需要按需填充并重新使用view来减少对象的创建。

    ListView加载数据都是在public View getView(int position, View convertView, ViewGroup parent) {}方法中进行的(要自定义listview都需要重写listadapter:如BaseAdapter,SimpleAdapter,CursorAdapter的等的getvView方法),优化listview的加载速度就要让convertView匹配列表类型,并最大程度上的重新使用convertView。

    getview的加载方法一般有以下三种种方式:

    最慢的加载方式是每一次都重新定义一个View载入布局,再加载数据

    public View getView(int position, View convertView, ViewGroup parent) {
    
     View item = mInflater.inflate(R.layout.list_item_icon_text, null);
    
     ((TextView) item.findViewById(R.id.text)).setText(DATA[position]);
    
     ((ImageView) item.findViewById(R.id.icon)).setImageBitmap(
    
     (position & 1) == 1 ? mIcon1 : mIcon2);
    
     return item;
    
    }

    正确的加载方式是当convertView不为空的时候直接重新使用convertView从而减少了很多不必要的View的创建,然后加载数据

    public View getView(int position, View convertView, ViewGroup parent) {
    
     if (convertView == null) {
    
     convertView = mInflater.inflate(R.layout.item, parent, false);
    
     }
    
     ((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);
    
     ((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap(
    
     (position & 1) == 1 ? mIcon1 : mIcon2);
    
     return convertView;
    
     }

    最快的方式是定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时重新使用即可

    static class ViewHolder {
    
    TextView text;
    
    ImageView icon;
    
    }
    
     
    
    public View getView(int position, View convertView, ViewGroup parent) {
    
     ViewHolder holder;
    
     
    
     if (convertView == null) {
    
     convertView = mInflater.inflate(R.layout.list_item_icon_text,
    
     parent, false);
    
     holder = new ViewHolder();
    
     holder.text = (TextView) convertView.findViewById(R.id.text);
    
     holder.icon = (ImageView) convertView.findViewById(R.id.icon);
    
     convertView.setTag(holder);
    
    } else {
    
    holder = (ViewHolder) convertView.getTag();
    
    }
    
    holder.text.setText(DATA[position]);
    
    holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
    
    return convertView;
    
    }

     

    三种方式加载效率对比如下图所示:

     

    说明:上述三个例子代码摘自google 2010 I/O大会

     

    当处理一些耗时的资源加载的时候需要做到以下几点,以使你的加载更快更平滑:

    1.   适配器在界面主线程中进行修改

    2.   可以在任何地方获取数据但应该在另外一个地方请求数据

    3.   在主界面的线程中提交适配器的变化并调用notifyDataSetChanged()方法

    转载:http://blog.csdn.net/jacman/article/details/7087995

  • 相关阅读:
    Sql Server 2008卸载后再次安装一直报错
    listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.
    Sql Server 2008修改Sa密码
    学习正则表达式
    Sql Server 查询第30条数据到第40条记录数
    Sql Server 复制表
    Sql 常见面试题
    Sql Server 简单查询 异步服务器更新语句
    jQuery stop()用法以及案例展示
    CSS3打造不断旋转的CD封面
  • 原文地址:https://www.cnblogs.com/liaojie970/p/5850530.html
Copyright © 2011-2022 走看看