安卓ListView如何滚动到顶部

80

我有一个带自定义行的 ListView 。当任何一行被点击时,ListView 的数据会重新生成。我希望在这种情况下列表可以回滚到顶部。

最初我尝试在每个行的OnClickListener中使用 setSelection(0) 来实现这一点,但是没有成功(我认为是因为当其数据失效时,ListView 失去了滚动的位置 - 所以我的调用被撤消了。我仍然不理解 ListView 在失效后如何决定滚动到哪里)。

我所知道的唯一有效的解决方案是由 Romain Guy 在这里提供的:http://groups.google.com/group/android-developers/browse_thread/thread/127ca57414035301

它涉及 (View.post) 调用 _listView.setSelection(0)。我发现这表现得相当糟糕。新生成的列表显示出来时滚动位置没有改变,在回滚到顶部前会有相当大的延迟。

有更好的方法来实现这个功能吗?

非常感谢您的帮助。

谢谢!

8个回答

135

使用 listView.setSelectionAfterHeaderView(); 来滚动到顶部。


69
这正是我会取的名字。 - markshiz

102

我尝试了很多方法,但这个对我有效。

list.smoothScrollToPosition(0);

3
太棒了!我想知道您能否改变滚动速度。 - theblang
还可以有一个回调函数来知道滚动结束的时间,以便我可以导航到下一个屏幕吗? - Amol Gupta

42

我只是使用listview.setSelection(0);

对我来说效果很好。


5
如果在 ListView 适配器的数据更改后需要即时滚动,请注意它可能尚未被填充。在这种情况下,您应该通过 Handlerpost() 方法将 setSelection()setSelectionAfterHeaderView() 延迟调用以确保在队列中稍后调用。请保留 HTML 标记。
listView.Handler.post(new Runnable() {
            @Override
            public void run() {
                listView.setSelectionAfterHeaderView();    
            }
        });

这对我很有用。

4

个人建议您寻找不同的UI模式。用户可能会觉得您当前的“点击,列表就在原地更改”的方法很直观,但我持怀疑态度。

您可以尝试子类化ListView并重写layoutChildren()以链接到超类,然后在需要的情况下调用setSelection(0)。如果“相当长的延迟”仅是由于post()调用,那么这应该可以解决问题。


4
谢谢您的建议,我很快会尝试一下。 列表是原地更改的,因为屏幕上其他地方显示了面包屑导航 - 典型的Android UI设计不太适合我的特定UI目标和目标用户。另外,感谢您所有的帮助 - 我已经阅读了您在stackoverflow上的许多答案和您的CommonsWare文献,它们在帮助我开始使用这个平台时有着重要的帮助! - aakash
这就是做事的方式,没有神奇的方法,只有纯粹的逻辑。谢谢! - Leo supports Monica Cellio

2

在某些不同的需求中,如果您想要像聊天时一样向上滚动。

        mListView.smoothScrollToPosition(mAdapter.getCount());

2
作为一种解决办法,您可以创建一个新的适配器包含新生成的数据,然后调用ListView.setAdapter。之后调用ListView.setSelection(n)。
顺便说一句,CommonsWare提供的解决方案可行。

2
这个在想要从listview头部集中edittext时很好用。
listview.setSelectionFromTop(0,0);

如果您想从列表视图中选择特定的索引视图,则:
listview.setSelection(index); // o for top

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