android - 为什么 ListView.getChildAt() 在 android 中返回 null

标签 android listview

我有两个列表 listArrayitemStateList .

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/

相关文章:

android - 如何在 Android 上处理 Facebook ShareDialog.canShow() == false

java - TextView setText 在 LinearLayout 中不起作用

android - 我应该扩展 ListActivity 吗? (到目前为止,没有它已经很好地工作了)

Android:防止在触摸时使用 ClickableSpan 更改 TextView 中文本的背景颜色

java - 比 HashTable 更好的数据结构来跟踪处理过的记录?

android - 广播接收器的生命周期

android - 当我旋转屏幕时出现奇怪的错误,viewpager 内的 ListView 将消失

c# - ASP.Net : DataPager Control always a step behind with paging

WPF ListView : Howto refresh manually?

android - 如何使用 nativescript 显示日期选择器