我从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,则第六行列表更改背景
更新:我只是为了简化问题而改变bg,实际上我想获得返回view的顶级位置。所以使用适配器不帮助我。
答案 0 :(得分:2)
您需要简单地调用getChildAt() with index 0
(如果您列出的视图有一些固定的标题,则为1)。这将始终是第一个可见项目,无论其在后备阵列中的数据位置如何。
答案 1 :(得分:1)
在我看来,你应该使用
Object item = getItemAtPosition(firstVisiblePosition)
其中item
是该行后面的data
对象。
然后在项目中放置一些标志,使其更改适配器的getView内的背景,并在适配器上调用notifyDataSetChanged
,以重绘列表。
您正在看到此问题,因为ListView会回收其子项。