我有两个清单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;
}
}
}
listView.getChildAt(i)起作用,其中0是第一可见行,而(n-1)是最后可见行(其中n是您看到的可见视图数)。
试试这个:
listView.getChildAt(positionOfChildYouWantGet - f_listView.getFirstVisiblePosition());
使用getChildAt和listAdapter.getView的区别在于:
getChildAt不是ListView专用的方法。它是为每个ViewGroup(可以有子代的View)实现的。
创建ListView时,它没有子级。调用其适配器的getView方法不会改变这一事实,它不会添加任何子级。
仅当对Activity的内容进行度量和布局时,ListView才会通过重复调用其适配器的getView方法并将返回的View添加到其自己的子级列表中来开始创建子级视图。只有在那之后,ListView.getChildAt(x)才能返回一些非空值。
ListAdapter.getView方法代表ListView / GridView / etc返回全新的View(或仅返回回收的View)。您的代码永远不要调用ListAdapter.getView本身(除非您进行单元测试)。
ListView.getChildAt返回一个已经创建的View(由ListAdapter.getView先前代表ListView创建)。请注意,您的ListAdpater可以定义许多列表项(由getCount返回的值),但是承载适配器的ListView将永远不会有更多子项在屏幕上任何给定时间都可以看到。也就是说,您的ListAdapter可以处理1000个列表项,但是ListView的子视图永远不会超过6个(当然,这取决于屏幕和listview-item的大小)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句