2010-06-24 160 views
10

有没有办法在Android中从ListView获取第一个可见视图?如何从Android ListView获取第一个可见视图

我可以获得支持适配器中第一个视图的数据,但看起来我无法在ListView中获得第一个视图。

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

+0

视图被回收。你需要什么具体的观点? – 2010-06-24 14:50:17

+0

我编辑我的问题。我想在用户滚动列表后更改视图。 – Janusz 2010-06-24 15:06:52

回答

12

其实ListView项目只是ListView的子项。所以,第一个可见的ListView项是:

listView.getChildAt(0) 
+0

如果您探测返回的视图为null,非常感谢您的工作。看起来,如果您开始活动并且有时候列表中没有孩子,则滚动和列表构建有时会同时发生。 – Janusz 2010-06-25 09:06:38

+5

我认为这种方式是错误的。因为你得到了第一个加载的项目。也许这个项目不是第一次可见的。但是listView.getFirstVisiblePosition()更好,并且总是很好。 – NrNazifi 2012-10-02 06:30:46

+0

如果有标题,则不准确。 – 2016-05-30 02:10:43

3

ListView中有一个功能getFirstVisiblePosition因此要获得第一个可见视图,代码为:

listView.getChildAt(listView.getFirstVisiblePosition());

+7

childAt()位置与getFirstVisiblePosition()返回的位置之间存在差异。 getFirstVisiblePosition的位置是我的数据适配器中的位置。 ChildAt仅考虑目前在列表视图中可见的视图。 – Janusz 2010-06-25 08:06:53

+0

我喜欢这个答案,并且发现它有用于找到可以工作的东西。然而,使用childAt与适配器的位置wsill不起作用。如果使用fetFirstVisiblePosition,则必须使用getItem再次将其传递给适配器。所以更正确的是adapter.getItem(listview.getFirstVisiblePosition)。然而,在那种情况下,你不会像操作系统那样提出问题。不过,谢谢你指出这一点。 – 2014-11-29 10:18:31

3

事实上listView.getChildAt(listView.getFirstVisiblePosition())给人的第一个可见项目,
但它可能是一半可见列表项。

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

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

您可以使用下面的代码:

for (int i = 0; i <= conversationListView.getLastVisiblePosition() - conversationListView.getFirstVisiblePosition(); i++) { 
     View listItem = conversationListView.getChildAt(i); 
} 
0

listView.scrollBy(0,-40);

这很好用

相关问题