2012-05-12 20 views
21

在Android中,我通常使用MyAdapter extends ArrayAdapterListView創建視圖,並作爲一個結果,我不得不重寫功能ListView適配器中`convertView`的用途是什麼?

public View getView(int position, View convertView, ViewGroup parent) { 
    // somecode here 
} 

但是,我不知道到底是什麼convertViewparent做!有沒有人有建議?更多細節,更多幫助!謝謝!

回答

38

從文檔,

convertView - 老視圖如果可能的話再利用。注意:你應該在使用之前檢查這個視圖是非空的並且是合適的類型。如果無法將此視圖轉換爲顯示正確的數據,則此方法可以創建新視圖。

換句話說,此參數嚴格用於提高您的Adapter的性能。當ListView使用Adapter來填充其行時使用View s時,適配器通過在每行上調用getView()來填充每個列表項,並使用View對象。適配器使用convertView作爲回收不再使用的舊對象View的一種方式。通過這種方式,ListView可以發送不再顯示的舊的「回收」視圖對象,而不必在適配器每次顯示新的列表項時實例化一個全新的對象。這是convertView參數的用途。

4

convertView是不可見的ListView項緩存,因此可以重複使用。它讓ListView不需要創建大量的ListItems,因此節省了Memeory並使ListView更加流暢。

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view; 
    if(convertView == null) { 
     view = this.inflator.inflate(android.R.layout.simple_list_item_1, parent, false); 
    } 
    else { 
     view = convertView; 
    } 
    // remaining implementation 
    return view; 
} 
+1

所以,我應該使用convertView如果我建我的看法沒有充氣XML文件? –

+0

@DanChaltiel是的,你做 – localhost

21

convertView用於重新使用舊視圖。

請理解在Android中的AdapterfunctionalityAdapter使您可以重新使用新數據的某些視圖。

因此,如果列表中有15個項目,但窗口只能顯示5個項目,那麼起初convertView將爲空,我們需要爲這五個項目創建新的視圖,但是當您向下滾動時,您有兩個選項創建6-10個視圖,或者重新使用舊視圖並將新數據加載到這些視圖中。 AdapterconvertView使您可以執行後面的方法。

+0

非常有用。用簡單的話來形容。 – tpk

1

較短的版本

請閱讀@Alex洛克伍德的和@截拳道的答案。

我的回答

爲什麼之前,這是更好/使用getView()convertView的正確方法是什麼?由羅曼蓋伊在這video很好解釋。

例如

@Override 
public View getView(final int position, View convertView, ViewGroup parent)   { 
    View rowView = convertView; 
    ViewHolder holderObject; 

if (rowView == null) { 
    rowView = inflater.inflate(R.layout.list_single_post_or_comment, parent, false); 
    holderObject = new HolderForContent(); 
    mapHolder(holderObject, rowView); 
    rowView.setTag(holderObject); 
    } else { 
    holderObject = (HolderForContent) convertView.getTag(); 
    } 
    setHolderValues(holderObject, position); 
    return rowView; 
} 

private class ViewHolder { 
    TextView mTextView; 
} 

mapHolder(holderObject, rowView) { 
    //assume R.id.mTextView exists 
    holderObject.mTextView = rowView.findViewById(R.id.mTextView); 
} 

setHolderValues(holderObject, position) { 
    //assume this arrayList exists 
    String mString = arrayList.get(position).mTextViewContent; 
    holderObject.mTextView.setText(mString); 
} 

上面只是一個例子,你可以按照任何類型的模式。但是記住這個

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    if (convertView == null) { 
     // todo : inflate rowView. Map view in xml. 
    } else { 
     // todo : get already defined view references 
    } 

    // todo : set data to display 

return rowView; 

} 

現在來目的convertView爲什麼

convertView用於性能優化 [在滑塊14 see圖表由羅曼蓋伊]通過不重新創建一個已創建的圖。

來源: 歡迎任何更正。我實際上通過這些鏈接收集了這些信息,

閱讀關於getView() Android developer documentation

Romain Guy談到getView()video「Turbo Charge Your UI」在Google IO 2009和material用於演示。

Lucas Rocha的精彩blog

那些想深入研究源代碼的人:ListViewgetView()的示例implementation可以在arrayAdapter的源代碼中看到。

相似的SO帖子。

how-do-i-choose-convertview-to-reuse

how-does-the-getview-method-work-when-creating-your-own-custom-adapter