ListView的优化之复用convertView和利用ViewHolder







紧接着我把屏幕往下滑动了几下
通过log可以看出来,(我是用log打印的方式将convertView打印出来了。倒着看,最后的VE前边的那一串数字变代表着一个convertView。从中可以看出来每个convertView都不一样)。每一次的滑动。都会产生一个新的convertView,如果有好几千行的话。那么肯定会造成内存的紧张。也会造成滑动的卡顿。所以需要进行优化。
以下分别是进行优化和没有优化的代码




//下边是没有优化的代码,从代码中可以看出来。不光没出现一个新的Item需要创建一个conver而且还需要不停的findViewById.于是进行了下边的优化
@Override
public View getView( int position, View convertView, ViewGroup parent) {
    // 加载 convertview
    convertView = View. inflate( context , R.layout.item_main , null);
    // 从 convertView 当中找到需要修改值的视图
    TextView tv_item_word = (TextView) convertView.findViewById(R.id. tv_item_word);
    TextView tv_item_name = (TextView) convertView.findViewById(R.id. tv_item_name);
    // 然后给各个视图装配数据
    tv_item_word.setText( data.get(position).getPinyin().substring( 0, 1));
    tv_item_name .setText( data.get(position).getName());
    Log.i( "TAG" , "有没有复用 convertView" +convertView);
    return convertView;
}

优化之后的代码,其实代码并不多。注释的多了而已。更方便理解
//在这里声明一下 holder 就是为了在 else 里边用的时候不至于 是空的
    ViewHolder holder;
    // 通过加了 if (convertView != null) 这个判断条件。就省略了重复创建的浪费资源的情况
    if (convertView == null) {
        convertView = View.inflate ( context, R.layout.item_main , null);
        holder = new ViewHolder();

        holder. tv_item_name = (TextView) convertView.findViewById(R.id. tv_item_name);
        holder. tv_item_word = (TextView) convertView.findViewById(R.id. tv_item_word);
        //可以将 setTag 理解成为一种容器方法。先将初始化好的 holder 存储在 convertView 里边
        convertView.setTag(holder);
    } else {
        //得到的 holder 是已经 findviewbyId 好了的。就不用再去 findviewbyid 了。也是一种优化
        holder = (ViewHolder) convertView.getTag();
      /*
       加载数据的方法不能写在这里边。因为刚开始 convertVie==null 的时候是不执行的。也就是将
       原来自己布局中的数据记载到了屏幕上
       holder.tv_item_word.setText(data.get(position).getPinyin().substring(0, 1));
        holder.tv_item_name.setText(data.get(position).getName());*/

    }
    // 装配数据
    holder. tv_item_word.setText( data .get(position).getPinyin().substring( 0, 1));
    holder.tv_item_name .setText( data.get(position).getName());
    return convertView;
}

static class ViewHolder {
    private TextView tv_item_word;
    private TextView tv_item_name;
}
//如果装配数据的的代码写在了else{}里边就会产生下边的现象;



  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值