listview getChildAt返回错误的孩子

时间:2014-08-31 07:47:46

标签: android listview android-listview

我从listview / getChildAt方法中获得了一些奇怪的行为。

我有listView并为它设置了300行的适配器。我尝试为我的列表设置onScrollListener,并在onScroll方法中获取firstVisibleItem视图并更改它的背景颜色。但是列表视图的getChildAt方法返回错误视图(确切地说它返回视图 DoubleVisibleItem的双倍)。

这是我的代码:

adapter = new ListAdapterShowContent(this, arrayList);
list.setAdapter(adapter);

list.setOnScrollListener(new OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            // TODO Auto-generated method stub

            View v = list.getChildAt(firstVisibleItem);
            if(v != null) {
                v.setBackgroundColor(Color.BLUE);
            }

        }
    });  

例如,如果onScroll中的firstVisibleItem为3,则第六行列表更改背景

enter image description here

更新:我只是为了简化问题而改变bg,实际上我想获得返回view的顶级位置。所以使用适配器不帮助我。

2 个答案:

答案 0 :(得分:2)

您需要简单地调用getChildAt() with index 0(如果您列出的视图有一些固定的标题,则为1)。这将始终是第一个可见项目,无论其在后备阵列中的数据位置如何。

答案 1 :(得分:1)

在我看来,你应该使用

Object item = getItemAtPosition(firstVisiblePosition)

其中item是该行后面的data对象。

然后在项目中放置一些标志,使其更改适配器的getView内的背景,并在适配器上调用notifyDataSetChanged,以重绘列表。

您正在看到此问题,因为ListView会回收其子项。