我有两个列表 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 是您看到的可见 View 的数量)。
试试这个:
listView.getChildAt(positionOfChildYouWantGet - f_listView.getFirstVisiblePosition());
使用 getChildAt 和 listAdapter.getView 的区别在于:
getChildAt 不是 ListView 的特殊方法。它是为每个 ViewGroup(可以有 subview 的 View )实现的。
创建 ListView 时,它没有子项。调用其适配器的 getView 方法不会改变这一事实,它不会添加任何子项。
只有当您的 Activity 的内容得到测量和布局时,ListView 才会开始创建 subview ,方法是重复调用其适配器的 getView 方法并将返回的 View 添加到它自己的 subview 列表中。只有在那之后,ListView.getChildAt(x) 才能返回一些非空值。
ListAdapter.getView 方法代表 ListView/GridView/等返回全新的 View (或只返回回收的 View )。您的代码永远不应调用 ListAdapter.getView 本身(除非您进行单元测试)。
ListView.getChildAt 返回一个已创建的 View (之前由 ListAdapter.getView 代表 ListView 创建)请注意,您的 ListAdpater 可能会定义许多列表项(getCount 返回的值),但托管适配器的 ListView 永远不会有的 child 多于屏幕上任何给定时间可以看到的 child 。 IE。您的 ListAdapter 可能处理 1000 个列表项,但您的 ListView 永远不会有超过 6 个 subview (当然取决于屏幕大小和 ListView 项)。
关于android - 为什么 ListView.getChildAt() 在 android 中返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42312016/