一、Adapter
Adapter是ListView和數據源之間的中間人。
當每條數據進入可見區時,adapter會調用他的getView()方法,並返回代表具體數據的視圖。滾動的時候頻繁調用,支持成千上萬的數據。
①、最簡單的方法,最慢最不實用
public void getView(int position , View convertView , ViewGroup parent){ View item = mInflater.inflate(R.layout.list_view, null); (TextView)item.findViewById(R.id.text).setText(DATA[position]); (ImageView)item.findViewById(R.id.img).setImageBitmap(icon); return item; }
②、利用convertView回收視圖,效率提高200%
public void getView(int position , View convertView , ViewGroup parent){ if(convertView == null){ convertView = mInflater.inflate(R.layout.list_view, null); } (TextView)convertView.findViewById(R.id.text).setText(DATA[position]);
(ImageView)convertView.findViewById(R.id.img).setImageBitmap(icon);
return convertView;
}
③、使用ViewHolder模式,效率再提高50%
static class ViewHolder{ private TextView tv; private ImageView iv; } public void getView(int position , View convertView , ViewGroup parent){ ViewHolder holder; if(convertView == null){ convertView = mInflater.inflate(R.layout.list_view, null); holder = new ViewHolder(); holder.tv = (TextView)convertView.findViewById(R.id.text); holder.iv = (ImageView)convertView.findViewById(R.id.img); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } holder.tv.setText(DATA[position]); holder.iv.setImageBitmap(icon); return convertView; }
更新的效率比較: