2016-08-26 129 views
3

我已閱讀了一些文章,並觀看了video以瞭解ListView的工作原理。所以,假設我有5個項目的列表(所有項目都可以在屏幕上看到)。我在我的自定義適配器下面的代碼從BaseAdapter繼承:android getView()如何在BaseAdapter中工作?

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    System.out.println("item position: " + position + " view " + view); 

    if (view == null) 
    { 
     view = LayoutInflater.from(context).inflate(R.layout.list_view_item, null); 
    } 
    return view; 
} 

當我運行此代碼,我看到控制檯輸出如下:

08-26 14:52:40.882: item position: 0 view null 
08-26 14:52:40.883: item position: 1 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container} 
08-26 14:52:40.883: item position: 2 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container} 
08-26 14:52:40.884: item position: 3 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container} 
08-26 14:52:40.884: item position: 4 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container} 
08-26 14:52:40.884: item position: 0 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container} 
08-26 14:52:40.884: item position: 1 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container} 
08-26 14:52:40.884: item position: 2 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container} 
08-26 14:52:40.884: item position: 3 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container} 
08-26 14:52:40.884: item position: 4 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container} 
08-26 14:52:40.884: item position: 0 view android.widget.RelativeLayout{88bc756 V.E...C.. ......I. 0,0-1080,65 #7f0e00b8 app:id/item_container} 
08-26 14:52:40.884: item position: 1 view android.widget.RelativeLayout{1264e60 V.E...C.. ......I. 0,68-1080,133 #7f0e00b8 app:id/item_container} 
08-26 14:52:40.884: item position: 2 view android.widget.RelativeLayout{36b089 V.E...C.. ......I. 0,136-1080,201 #7f0e00b8 app:id/item_container} 
08-26 14:52:40.884: item position: 3 view android.widget.RelativeLayout{e1a12bb V.E...C.. ......I. 0,204-1080,269 #7f0e00b8 app:id/item_container} 
08-26 14:52:40.885: item position: 4 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container} 

getView()viewnull只爲0位置。看完後,我認爲我有null前5個電話(直到所有可見的項目視圖未初始化)。爲什麼只有第一個?我錯過了什麼?

+0

是否可以發佈您的list_view_item代碼 – Ashish

+0

在我的環境中,視圖全爲空。你能發佈完整的佈局和適配器代碼嗎? – nshmura

回答

0

這是視圖的工廠方法。爲了防止一遍又一遍地創建複雜的視圖,您可能會返回創建的視圖,並在稍後作爲框架參數接收它。

您應該檢查,是否可以重複使用您的視圖(例如,類型匹配,如果您有不同的線可視化),然後使用視圖的性能原因,而不是創建一個新的(膨脹一個新的一)。

查看通脹涉及解析XML。而且成本很高。這就是爲什麼API允許你重用組件。這是UI開發中的常見模式。

這就是爲什麼你在第一次調用時,以及稍後在視圖的一個實例上有空。

1

ListView回收視圖,所以第一次運行它將是null因爲你必須膨脹視圖。一旦你膨脹視圖,你應該重新使用相同的視圖,只是更新內容,以提高性能。我會推薦觀看以下視頻https://www.youtube.com/watch?v=wDBM6wVEO70,他們很好地解釋了列表視圖是如何工作的。

+0

此視頻非常有用。但是我沒有找到答案,getView()是如何工作的(當它被調用的時候和頻率)。我從中得到的所有信息:'getView()'是根據一些內部回收算法調用的,但沒有任何說明它是如何工作的。我知道它可能會改變,但我想知道至少一些近似的模式。 – Natasha

+0

那麼getView()將被調用,每個視圖在屏幕上可見。您可以添加一個斷點並查看該行爲。我建議去源代碼,以確切瞭解回收算法的工作原理。 –

相關問題