2017-02-18 120 views
1

我有兩個列表listArrayitemStateList爲什麼ListView.getChildAt()在android中返回null

listArray包含文本要顯示在ListViewitemStateList包含顏色名稱以設置ListView中的背景。但listView.getChildAt(i)總是返回null

我在StackOverflow上找到了一些解決方案,聲明使用listView.getAdapter().getView(i)代替。但沒有詳細說明,爲什麼要使用listView.getAdapter()以及爲什麼listView.getChildAt()不起作用。也只是想知道何時使用listView.getChildAt()

下面是代碼..

public void createAndSetAdapter(){ 

    ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, listArray); 

    listView.setAdapter(adapter); 

    for(int i = 0; i < listArray.size(); i++){ 
     switch (itemStateList.get(i)){ 
      case "Green_color": 
       listView.getAdapter().getView(i, null, listView).setBackgroundColor(Color.parseColor("#AAFF7F")); 
       break; 
      case "red_color": 
       listView.getAdapter().getView(i, null, listView).setBackgroundColor(Color.parseColor("#FFAAAA")); 
       break; 
      default: 
       break; 
     } 
    } 
} 
+0

''for'循環中的listArray'和'switch'中的'itemStateList'都不同'list' –

+0

'for'循環的循環等於'listArray'的大小。而'switch'則根據itemStateList來檢查在ListView中設置的顏色。 –

+0

爲什麼-1,我的代碼工作正常,只想知道'getChildAt()'和'getAdapter()。getView()'之間的區別。 –

回答

3

listView.getChildAt(I)的工作原理,其中0是第一個可見行和第(n-1)是最後的可見行(其中,n是數你看到的可見視圖)。

試試這個:使用getChildAt和listAdapter.getView之間

listView.getChildAt(positionOfChildYouWantGet - f_listView.getFirstVisiblePosition()); 

區別在於:

的getChildAt不是特別到ListView的方法。它針對每個ViewGroup(可以有孩子的視圖)實現。

創建ListView時,它沒有子項。調用其適配器的getView方法不會改變這個事實,它不會添加任何子項。

只有當您的Activity的內容得到測量和佈局後,ListView纔會重複調用其適配器的getView方法並將返回的Views添加到其自己的子列表中,開始創建子視圖。只有在那之後,ListView.getChildAt(x)才能返回一些非空值。

ListAdapter.getView方法代表ListView/GridView/etc返回全新的視圖(或僅返回循環視圖)。你的代碼不應該調用ListAdapter.getView本身(除非你做單元測試)。請注意,您的ListAdpater可能會定義許多許多列表項(由getCount返回的值),但託管適配器的ListView將會返回一個已經創建的視圖(由ListAdapter.getView先前代表ListView創建)從來沒有比在屏幕上的任何給定時間可見的兒童更多的孩子。即你的ListAdapter可能會處理1000個列表項目,但是你的ListView永遠不會有6個以上的子視圖(當然,這取決於屏幕和listview項目的大小)。