如何从Android ListView中获取第一个可见的视图?

10

有没有一种方法可以在Android中从ListView中获取第一个可见的View?

我可以获取适配器中第一个View的数据,但似乎无法获取ListView中的第一个View。

我想在滚动操作完成后更改第一个可见的视图。我知道不应该保存对视图的引用。


视图已经被回收利用。你需要这个特定的视图做什么? - Robby Pond
我编辑了我的问题。我想在用户滚动列表之后更改视图。 - Janusz
6个回答

13

实际上,ListView的项目只是ListView的子项。因此,第一个可见的ListView项目是:

listView.getChildAt(0)

非常感谢!如果您对返回的视图进行探测,它会很好地工作。似乎滚动和列表构建有时会同时发生,如果您开始活动并且有时列表没有子元素。 - Janusz
7
我认为这种方法是错误的。因为你得到的是第一个被加载的项目,有可能它并不是第一个可见的。但是listView.getFirstVisiblePosition() 更好,并且总是有效的。 - NrNazifi
如果有标题,则不准确。 - Gabe Sechan

4

ListView有一个函数getFirstVisiblePosition,用于获取第一个可见视图,代码如下:

listView.getChildAt(listView.getFirstVisiblePosition());

请注意:上述代码中的listView是指ListView对象的实例。

8
childAt()方法返回的位置和getFirstVisiblePosition()返回的位置是有区别的。getFirstVisiblePosition()返回的是数据适配器中第一个可见项的位置,而childAt()只考虑当前ListView中可见的视图。请注意不要改变原意。 - Janusz
1
我喜欢这个答案,发现它对于找到可用的东西非常有用。然而,使用childAt和适配器中的位置将不起作用。如果您使用getFirstVisiblePosition,则必须再次使用getItem将其传递给适配器。因此,更正确的方法是adapter.getItem(listview.getFirstVisiblePosition)。然而,在这种情况下,您没有像op所要求的视图。尽管如此,感谢您指出这一点。 - user458577

4

实际上,listView.getChildAt(listView.getFirstVisiblePosition())可以获得第一个可见的列表项,
但是它可能是半个可见的列表项。

要获取第一个完全可见的列表项,

if (listView.getChildAt(0).getTop() < 0) {
     int firstCompletelyVisiblePos = listView.getFirstVisiblePosition() + 1;
}

1
Object item = listView.getItemAtPosition(listView.getFirstVisiblePosition());

对于第一个完全可见的列表项:

int pos = listView.getFirstVisiblePosition();
if (listView.getChildCount() > 1 && listView.getChildAt(0).getTop() < 0) pos++;
Object item = listView.getItemAtPosition(pos);

0
你可以使用以下代码:
for (int i = 0; i <= conversationListView.getLastVisiblePosition() - conversationListView.getFirstVisiblePosition(); i++) {
        View listItem = conversationListView.getChildAt(i);
}

-2

listView.scrollBy(0, -40);

这个非常有效


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接