任何人都可以請解釋兩種getView()實現之間有什麼區別嗎?這兩種getView()的實現有什麼區別?
第一個檢查convertView
是否爲空;如果它爲null,則膨脹一個新的View對象。然後設置適當的值的子視圖。
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
if(convertView == null)
{
LayoutInflater inflater = context.getLayoutInflater();
convertView = inflater.inflate(R.layout.itemlayout, null, true);
}
ImageView image = (ImageView) convertView.findViewById(R.id.icon);
TextView text = (TextView) convertView.findViewById(R.id.name);
MyItem item = items[position];
text.setText(item.name);
if("male".equals(item.gender))
{
image.setImageResource(R.drawable.male);
}
else if("female".equals(item.gender))
{
image.setImageResource(R.drawable.female);
}
return convertView;
}
第二個是所謂的「ViewHolder」模式。許多開發人員說這種方法可以節省大量的內存和CPU時間。但是第一個實現也檢查了convertView的存在。第一種方法不是保存一些內存嗎?任何人都可以更深入,更清楚地解釋兩種實現之間的區別嗎?非常感謝。
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder;
View itemView = convertView;
if(itemView == null)
{
LayoutInflater inflater = context.getLayoutInflater();
itemView = inflater.inflate(R.layout.itemlayout, null, true);
holder = new ViewHolder();
holder.image = (ImageView) itemView.findViewById(R.id.icon);
holder.text = (TextView) itemView.findViewById(R.id.name);
itemView.setTag(holder);
}
else
{
holder = (ViewHolder) itemView.getTag();
}
MyItem item = items[position];
holder.text.setText(item.name);
if("male".equals(item.gender))
{
holder.image.setImageResource(R.drawable.male);
}
else if("female".equals(item.gender))
{
holder.image.setImageResource(R.drawable.female);
}
return itemView;
}
這不僅僅是findViewById(),儘管它是最常見的用例。 ViewHolder可以也應該用來存儲臨時數據結構,以避免getView()中的內存分配。一個很好的例子可以在這裏找到:http://goo.gl/NzgTt和http://goo.gl/d4vvo ViewHolder包含一個字符緩衝區,以避免從光標獲取數據時的分配。 – 2011-05-19 16:30:40
相關提示=) – BFil 2011-05-19 17:19:13