我有两个列表listArray
和itemStateList
。
listArray
包含要在ListView
中显示的文字,而itemStateList
包含用于设置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 :(得分:3)
listView.getChildAt(i)的工作原理,其中0是第一个可见行,(n-1)是最后一个可见行(其中n是您看到的可见视图数)。
试试这个:
listView.getChildAt(positionOfChildYouWantGet - f_listView.getFirstVisiblePosition());
使用getChildAt和listAdapter.getView之间的区别在于:
getChildAt不是ListView特有的方法。它是为每个ViewGroup(可以有孩子的视图)实现的。
创建ListView时,它没有子项。调用其适配器的getView方法不会改变这一事实,它不会添加任何子节点。
只有当您的Activity的内容被测量和布局时,ListView才会通过重复调用其适配器的getView方法并将返回的Views添加到其自己的子列表中来开始创建子视图。只有在那之后,ListView.getChildAt(x)才能返回一些非空值。
ListAdapter.getView方法代表ListView / GridView / etc返回全新的Views(或只返回循环的View)。您的代码永远不应该调用ListAdapter.getView本身(除非您进行单元测试)。
ListView.getChildAt返回一个已创建的View(由ListAdapter.getView代表ListView创建)请注意,ListAdpater可能会定义许多列表项(getCount返回的值),但托管适配器的ListView将永远不会有更多的孩子在屏幕上的任何给定时间都可以看到。即你的ListAdapter可以处理1000个列表项,但你的ListView永远不会有超过6个子视图(当然,取决于屏幕和listview项的大小)。