单item布局的listView优化

这是我的第一篇博客,我觉得得写点东西能记录下我到底学到了什么,第一篇写关于ListView的一些东西吧。

ListView的优化

listview优化其实主要是两方面,

  1. convertView视图的回收,滑出控件可视范围的ItemView会被放入视图回收器中,适配器中的getView方法会传进convertView,如果convertView不为空,说明有可回收视图,就可以不用生成视图,但该视图可能有旧的数据,需要重新赋值。
  2. findViewById的效率是很低的,如果每次返回对象都要用findViewbyid来找控件填值,会影响listview的性能。view对象提供了一个方法setTag(Object),我们可以建立一个内部类viewholder(可以随意命名),里面存储一些view中的控件对象,然后把对象放进setTag里,这下找控件就可以通过在holder对象直接找,比findviewbyid快多了。

优化前的代码

public View getView(int position, View convertView, ViewGroup parent) {
    // 视图对象,假设视图中有个控件TextView
    View view = View.inflate(getBaseContext(), R.layout.item_list, null);
    TextView text = (TextView)view.findViewById(R.id.tv);
    text.setText("优化前");
    return view;
}

优化后

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder=null;
    if(convertView==null){//convertViewde是否可以回收的判断
        convertView = View.inflate(getBaseContext(), R.layout.item_list, null);
        holder=new HolderView();
        holder.tv= (TextView)view.findViewById(R.id.tv);
        convertView.setTag(holder);//把已经找好控件的holder对象放进视图标记中
    }
    else{
        //可回收的convertView中就不用再findViewbyid了
        holder=(ViewHolder)convertView.getTag();
    }
    holder.tv.setText("优化后");
    return convertView;
}
//该类是自己建的BaseAdapter的内部类,
private static class HolderView{
    //存储着视图要找的控件
    public TextView tv;
}

必须提到的是,不是每个listview都需要优化,如果你的item项不多,一页就可以显示,那么直接用优化前的版本就可以,因为一页可以显示那会存在可回收视图的情况,用优化后的反而代码更多,还多浪费的内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值