2017-02-18 11 views
1

私はlistArrayitemStateListの2つのリストを持っています。ListView.getChildAt()がアンドロイドでnullを返す理由

listArrayListViewに表示するテキストを含むされ、itemStateListListViewで背景を設定する色名を含有します。 listView.getChildAt(i)は常にnullを返します。

代わりにlistView.getAdapter().getView(i)を使用すると記載されているStackOverflowの解決方法があります。 listView.getAdapter()となぜlistView.getChildAt()が動作しないのかについての詳細はありませんでした。 listView.getChildAt()をいつ使用するかを知りたいだけです。ここ

0は非常に最初に表示される行と(N-1)である

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)が動作し..コードであり、nが数である最後の表示行(ありますあなたが見る目に見える景色)。

これを試してください。getChildAtとlistAdapter.getViewを用い間

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

違いはある:

getChildAtは、リストビューに特別な方法ではありません。各ViewGroup(子を持つことができるView)に対して実装されています。

ListViewを作成すると、子はありません。アダプタのgetViewメソッドを呼び出すと、その事実は変更されず、子が追加されません。

アクティビティのコンテンツが測定およびレイアウトされた場合にのみ、ListViewは、そのアダプタのgetViewメソッドを繰り返し呼び出し、返されたビューを独自の子リストに追加することによって、子ビューの作成を開始します。その後、ListView.getChildAt(x)はnull以外の値を返す可能性があります。

ListAdapter.getViewメソッドは、ListView/GridView/etcの代わりに新しいViewを返します(またはリサイクルされたViewを返します)。あなたのコードはListAdapter.getView自体を呼び出すべきではありません(ユニットテストをしない限り)。

ListView.getChildAtは、既に作成されたView(ListViewの代わりにListAdapter.getViewによって先に作成されたビュー)を返します。ListAdpaterは多くのリスト項目(getCountから返される値)を定義できますが、アダプタをホストするListViewは画面上の任意の時間に表示できるよりも多くの子供を持つことはありません。私。あなたのListAdapterは1000個のリストアイテムを扱うことができますが、ListViewは6個以上の子ビューを持つことはありません(もちろんscreenとlistview-itemのサイズに依存します)。

関連する問題