Android开发中经常需要用到如ListView的类,还有比如ExpandableListView等,当加载少量数据时,并没有区别;但是当加载大量数据,且结构较复杂时,就需要考虑ListView的性能优化了。
对ListView的性能优化,属于老生常谈了,主要从四个方面考虑:
- 复用convertView
- 复用holder类
- 使用分段加载
- 分页加载
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条数据采用分段加载,这样用户的体验会相对好些)。