簡體   English   中英

getView()的兩種實現有什么區別?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM