衆所周知,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