对于提升Android中频繁使用的ListView子Item View的加载效率,基于两点基本考虑:
1,Android的View的创建比较消耗资源;
2,findViewById()也不是最快的。
所以在实际开发中经常使用的适配器中的getView()方法:
public View getView(int position, View convertView, ViewGroup parent);
如果每次都在里面创建一个新View出来,将导致效率低下,比较高效率的做法是每次判断convertView是否为空,若不为空,则直接使用convertView的findViewById()把子View重建出来即可。
但是,这种做法虽然提升了效率,但仍不是最高效的做法,因为还是使用了findViewById()。
因此,进一步的效率提升改进之处是:使用一种称为“ViewHolder”的技术,缓存convertView中的View组件,使用convertView的setTag()和getTag(),每次当ListView需要创建Item的View时候,调用convertView的getTag()找出ViewHolder,重新复用。具体的使用方法如代码所示:
package zhangphil.listview;
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ListView lv = this.getListView();
setContentView(lv);
ArrayAdapter adapter = new MyAdapter(this,
android.R.layout.simple_list_item_2);
lv.setAdapter(adapter);
}
private class MyAdapter extends ArrayAdapter {
private int resId;
private LayoutInflater mInflater;
private ViewHolder holder = null;
public MyAdapter(Context context, int resource) {
super(context, resource);
this.resId = resource;
mInflater = LayoutInflater.from(context);
}
//子View的“容器”
public final class ViewHolder {
public TextView text1;
public TextView text2;
}
@Override
public int getCount() {
//巨大的数据
return 10000;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(resId, null);
holder = new ViewHolder();
holder.text1=(TextView) convertView.findViewById(android.R.id.text1);
holder.text2=(TextView) convertView.findViewById(android.R.id.text2);
convertView.setTag(holder);
}
else
holder=(ViewHolder) convertView.getTag();
holder.text1.setText("text1:"+position);
holder.text2.setText("text2:"+position);
return convertView;
}
}
}