2017-02-18 71 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项目的大小)。