Android ListView优化原理



工作原理:

1、ListView 针对List中每个item,要求 adapter “给我一个视图” (getView)。

2、一个新的视图被返回并显示

如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?NO!这不可能!

实际上Android为你缓存了视图。


Android中有个叫做Recycler的构件,下图是他的工作原理:

1、如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中。

2、ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的。

3、当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图。


如果不用convertView,效率是很低的,如以下代码:

public void getView(int position , View convertView , ViewGroup parent){
        View item = mInflater.inflate(R.layout.list_view, null);
        (TextView)item.findViewById(R.id.text).setText(DATA[position]);
        (ImageView)item.findViewById(R.id.img).setImageBitmap(icon);
        return item;
    }


利用convertView回收视图,效率提高特别多:

<span style="color:#000000;">public void getView(int position , View convertView , ViewGroup parent){
        if(convertView == null){
            convertView = mInflater.inflate(R.layout.list_view, null);
        }
      (TextView)convertView.findViewById(R.id.text).setText(DATA[position]);
      (ImageView)convertView.findViewById(R.id.img).setImageBitmap(icon);
         return convertView;
    }  
</span>

更为快捷的是结合viewHolder使用,将convertView的tag设置为ViewHolder,不为空是重新使用,减少了不必要的convertview不为空时的每次findViewById的查找过程,提升了效率。

static class ViewHolder{
        private TextView tv;
        private ImageView iv;
    }
    
    public void getView(int position , View convertView , ViewGroup parent){
        ViewHolder holder;
        if(convertView == null){
            convertView = mInflater.inflate(R.layout.list_view, null);
            holder = new ViewHolder();
            holder.tv = (TextView)convertView.findViewById(R.id.text);
            holder.iv = (ImageView)convertView.findViewById(R.id.img);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }
        holder.tv.setText(DATA[position]);
        holder.iv.setImageBitmap(icon);
        return convertView;
    }

我们写的时候可能都是这样规范的写的,不过可能不太晓得这其中的原理,记录于此。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值