Android之ListView性能优化

Android开发中经常需要用到如ListView的类,还有比如ExpandableListView等,当加载少量数据时,并没有区别;但是当加载大量数据,且结构较复杂时,就需要考虑ListView的性能优化了。

对ListView的性能优化,属于老生常谈了,主要从四个方面考虑:

  1. 复用convertView
  2. 复用holder类
  3. 使用分段加载
  4. 分页加载

1、复用convertView

思路:在自定义Adapter时,需要重写getView方法,返回一个convertView对象。当convertView为null时,需要加载一个视图;如果不为null,则可以复用convertView。

示例代码:

@Override
public void getView(int position,View convertView,ViewGroup parent){
    if(convertVeiw==null){
        
    //判断convertView是否为null,如果为null则重新加载;如果不为null,则复用
    convertView=LayoutInflater.from(this).inflate(R.layout.parent_item,null);
    }

    TextView tv=(TextView)convertView.findViewById(R.id.tv_item);
    tv.setText("mmmm");
    return convertView;
}

2、复用holder

思路:复用holder类,可以减少findViewById的次数,从而减少通过加载View来找到id的次数,进而提高运行速度。

示例代码:

@Override
public void getView(int position,View convertView,ViewGroup parent){
    Holder holder=new Holder();
    if(convertVeiw==null){
        
    //判断convertView是否为null,如果为null则重新加载;如果不为null,则复用
    convertView=LayoutInflater.from(this).inflate(R.layout.parent_item,null);
    convertView.setTag();//为convertView设置tag
    }
    holder=(Holder)convertView.getTag();
    holder.tv=(TextView)convertView.findViewById(R.id.tv_item);
    holder.tv.setText("mmmm");

    return convertView;
}


public class Holder{
    private TextView tv;
}

3、分段加载

在有些情况下我们需要加载网络中的数据,显示到ListView,如果数据量较多,比如有100条数据,如果不选择优化,那么ListView会把所有的数据全部加载进来,这是相当耗时的一件事情。

解决思路:采取分段加载的思想

        先加载20条数据,然后使用Adapter刷新ListView,然后再加载20条数据...如此反复。

4、分页加载

思路:采用分段加载的思路,也不能完全解决OOM的情况,虽然我们在分段中一次加载20条数据到List集合中,然后再刷新到ListView中。假如有3000条数据,如果我们顺利的读到List集合中还是会积累较多的数据,还可能会造成OOM的情况,这时候就需要用到分页(将3000条数据分成30页,每一页显示100条数据,再将这100条数据采用分段加载,这样用户的体验会相对好些)。

猜你喜欢

转载自blog.csdn.net/weixin_38664232/article/details/85111236