2011-12-05 41 views
1

究竟發生我看到這個有很多在getView適配器擴展覆蓋:什麼在getView

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     if (v == null) { 
      LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.whatever, null); 
     } 

我得到語義上發生了什麼 - 「如果convertView爲null,則它充氣」,但我真的不明白爲什麼 - 什麼情況會將視圖轉換爲空,在什麼情況下它已經是一個視圖?

此外(並且我知道「每個帖子有1個問題」),但是因爲它與上面的有關 - 在膨脹方法中究竟發生了什麼?我知道它一般不(「膨脹」視圖資源被解析並填充),但不完全神交它...

TYIA

+0

適配器被AdapterView使用...一些實現AdapterView(AbsListView和其他)使用getView ...以及...獲取視圖,適配器項...有很多優化在這個實現...所以AbsListView(和其他)不會創建新的視圖,而是重用未使用。 ..我的意思,但「未使用」...我會嘗試向你展示的例子... ListView應該有大約100個元素...但只有5個是可見的,所以ListView將調用FXView getView與convertView ==空約7次,然後將嘗試指向未使用的一個作爲convertView ... – Selvin

回答

3

假設您的列表適配器有1000個對象。每個對象都由一個視圖表示。在電話屏幕上只有可能有10個這樣的視圖。你滾動列表希望看到更多的項目。因爲你正在滾動,所以有些項目不見了。對於框架來說,創建更多的視圖是沒有意義的,因爲它們與那些剛剛失控的視圖完全一樣。因此,框架可以重新使用它之前創建的一些視圖,因此它通過爲您提供非空convertView爲您提供這種可能性。

在膨脹方法中,一個View對象從一些XML資源中創建。 XML資源對視圖的描述足以創建該視圖,因此inflate方法執行該創建。所以沒有意見 - 你創建一個新的膨脹,已經有一個視圖 - 你可以重用它(你不必但你應該)

+0

太好了,謝謝 – momo

2

完整的信息,我建議你看這個video 它會告訴你很多信息包括髮生什麼getView()

+1

好視頻,非常豐富 - 感謝鏈接 – momo

8

AFAIK,這是getView的工作原理。

假設您有一個包含50個項目的列表,並且一次只能看到5個項目。 getView最初將被調用5次,並且convertView對於每一行都將爲空,並且新行應該被誇大。

當您滾動瀏覽列表時,getView將在屏幕上顯示下一行時再次被調用。現在,由於已經爲列表渲染了5行,因此將通過使用新值更新現有行來顯示新行來回收這些行。在這種情況下,convertView不會爲空。

+0

+1爲好,清晰的答案...我給了接受亞歷克斯,因爲他涵蓋了兩個問題...他可以使用積分超過你的要求:) – momo

+0

Blessenm的答案當然更加清晰準確 - 我完全同意這一點。我也贊成這個答案,如果這個答案可以被接受,而不是不準確的我的,那將是非常棒的。 –

相關問題