众所周知,Adapter是ListView与界面和数据之间的桥梁,通过Adapter中的gerView()方面来获得界面要显示的View,但你有没有想过,当ListView中数据量很大时,如何对Adapter进行优化呢?
以下有三种实现方式,具体来看一下。
1.
public View getView(int position, View convertView, ViewGroup parent){
final LayoutInflater inflater = (LayoutInflater) mContext.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.list_item_icon_text, null);
((ImageView) v.findViewById(R.id.icon)).setImageResource(R.drawable.icon);
((TextView) v.findViewById(R.id.text)).setText(mData[position]);
return v;
}
这是最简单的一种方式,没有经过任何的优化,菜鸟级别的人很容易这样做。
2.
public View getView(int position, View convertView, ViewGroup parent){
if(convertView == null){
convertView = inflater.inflate(R.layout.list_item_icon_text, null);
}
((ImageView) v.findViewById(R.id.icon)).setImageResource(R.drawable.icon);
((TextView) v.findViewById(R.id.text)).setText(mData[position]);
return convertView;
}
这是一种稍微改进的方式,有形成每个ListView的item时,每个Item的容器对象进行了重得利用。
3.
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
final LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item_icon_text, null);
holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
holder.text = (TextView) convertView.findViewById(R.id.text);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.icon.setImageResource(R.drawable.icon);
holder.text.setText(mData[position]);
return convertView;
}
static class ViewHolder {
ImageView icon;
TextView text;
}
这是09年Google IO大会上给出的优化建议,经过改进后,在处理大量数据的时候,确实流畅了很多。
文章参照:
http://www.ideasandroid.com/archives/295
http://www.cnblogs.com/halzhang/archive/2010/12/05/1896791.html