问题描述:Adapter给ListView做适配的时候,当List中条目数据过多时,会极大地消耗内存,即使复用convertView,还是需要每次都去找到convertView中的控件(findViewById方法)最后可能导致应用的崩溃,如何进行优化?
分析:现在已经可以复用convertView了,因此最好减少找到converiView内部控件的次数,因此可以创建一个ViewHolder容器,里面存放每个item里面的所有控件,并将这个类设为静态的,每当convertView为null时,则查找其内部的控件,给ViewHolder内的控件赋值;每当convertView不为null时,只要获取到之前设置给convertView的ViewHolder对象即可则直接复用该Holder中的控件,而无需重新进行控件的查找过程,以此达到优化的目的。
实现:
(1)现假设ListView每个条目的布局中有三个控件,分别是textView1,textView2,imageView1。因此构造一个ViewHolder静态类,包含这三个控件。
static class ViewHolder {
TextView textView1;
TextView textView2;
ImageView imageView1;
}
(2)在重写BaseAdapter的getView()方法中,编写以下代码:
@Override
public View getView(final int position, View convertView,ViewGroup parent) {
// 复用ViewHolder步骤一
ViewHolder holder = null;
if (convertView == null) {
convertView = View.inflate(getApplicationContext(),R.layout.listview_XXX_item, null);
// 2.减少findviewbyid的次数
holder = new ViewHolder();
holder.textView1= (TextView) convertView.findViewById(R.id.textView1);
holder.textView2= (TextView) convertView.findViewById(R.id.textView2);
holder.imageView1= (ImageView) convertView.findViewById(R.id.imageView1);
// 将Holder对象设置给convertView
convertView.setTag(holder);
} else {
//下次复用的时候直接将Holder对象取出来用,而无需寻找控件
holder = (ViewHolder) convertView.getTag();
}