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

时间:2017-02-18 06:42:48

标签: 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;
        }
    }
}

1 个答案:

答案 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项的大小)。