Android 提升ListView的运行效率

1、描述

    在getView方法中每次都将布局重新加载了一遍,当ListView快速滚动的时候这就会成为性能的瓶颈。

2、优化1

     对getView方法中进行了判断,如果convertView为空,则使用LayoutInflater去加载布局,如果不为空则直接对convertView进行重用。这样就大大提高了ListView的运行效率,在快速滚动的时候也可以表现出更好的性能。
public View getView(int position,View convertView,ViewGroup parent){
    Furit furit = getItem(position);
    View view ;
    if(convertView == null)
    {
        view = LayoutInflater.from(getContext().inflate(resourceId,null));  
    }else
    {
        view = convertView;
    }
}
 到目前为止,虽然不会再重复去加载布局,但是每次在getView方法中还是会调用View的findViewById方法来获取一次控件的实例。

2、优化2

    借助一个ViewHolder来对这部分的性能进行优化。
publci View getView(int position,View convertView,ViewGroup parent){
    Furit furit = getItem(position);
    View view;
    ViewHolder viewHolder;
    if(convertView == null)
    {
        view = LayoutInflater.from(getContext(),inflate(resourceId,null));
        viewHolder = new viewHolder();
        viewHolder.fruitImage = (ImageView)view.findVierById(R.id.fruit_image);
        viewHolder.fruitName = (TextView)view.findVierById(R.id.fruit_name);
        view.setTag(viewHolder);//将ViewHolder存储在View中
    }else
    {
        view = convertView;
        viewHolder = (ViewHolder)view.getTag();//重新获取ViewHolder
    }
    viewHolder.fruitImage.setImageResource(fruit.getImageId());
    viewHolder.fruitName.setText(fruit.getName());
    return view;
 }

class ViewHolder{
    ImageView furitImage;
    TextView fruitName;
}
    新增一个内部类ViewHolder,用于对控件的实例进行缓存,当convertView为空的时候,创建一个ViewHolder对象,并将控件的实例都放在ViewHolder里,然后调用View的setTag()方法,把ViewHolder对象存储在View中。当convertView不为空的时候则调用View的getTag方法,把ViewHolder重新取出,这样所有控件的实例都缓存了ViewHolder里,就没有必要每次通过findViewById()方法来获取控件实例了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值