[英]What's the difference between the two kinds of implementation of the getView()?
任何人都可以解釋兩種getView()實現之間的區別是什么?
第一個只是檢查convertView
是否為null; 如果它為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;
}
第二個模式創建ViewHolder的靜態實例,並在第一次加載時將其附加到視圖項,然后在將來的調用中從該視圖標記中檢索它
getView()被非常頻繁地調用,尤其是在滾動大的元素列表時,實際上每次滾動時列表視圖項都可見時會調用它。
這會阻止findViewById()多次被調用無用,將視圖保留在靜態引用上,這是保存一些資源的好模式(特別是當您需要在listview項目中引用許多視圖時)。
使用viewHolder可以防止每次需要在屏幕上綁定視圖時調用findviewById()。 這意味着視圖被誇大,並且連接到它的資源只被初始化一次(通脹,findById,聽眾,內容不會像靜態標題那樣改變)。 所以使用它可以在使用列表時提供更好的性能,因此總是建議的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.