Android ListView滚动到顶部


80

我有一个ListView自定义行。单击任何这些行时,将重新生成ListView的数据。发生这种情况时,我希望列表返回顶部。

我最初尝试setSelection(0)在每行中使用OnClickListener 来实现此目的,但没有成功(我相信是因为ListView 当数据无效时,丢失了其滚动位置-因此我对setSelection的调用被撤消。我仍然不知道ListView如何决定滚动到的位置无效后)。

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

它涉及View.post对的调用_listView.setSelection(0)。我发现它的效果很差。将显示新生成的列表,其滚动位置保持不变,并且滚动回顶部之前会有相当大的延迟。

有没有更好的方法来实现此功能?

任何帮助将非常感激。

谢谢!

Answers:



102

我已经尝试了很多,但是这个对我有用

list.smoothScrollToPosition(0);

3
这太棒了。我想知道您是否可以更改滚动速度。
theblang

还可以在回调函数中知道scoll何时结束,以便我可以导航到下一个屏幕吗?
Amol Gupta

41

我只是用 listview.setSelection(0);

对我来说很好。


5

如果在ListView适配器的数据更改后需要即时滚动,请注意可能尚未填充。在这种情况下,你应该post()setSelection()setSelectionAfterHeaderView()通过Handler,因此将在后面排队叫。

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 2010年

这是做到这一点的方法,没有神奇的方法,只有纯逻辑。谢谢!
Leo

2

解决方法是,可以创建一个包含新的重新生成的数据的新适配器,然后调用ListView.setAdapter。之后,调用ListView.setSelection(n)。

顺便说一句,由Commonsware提供的解决方案已经奏效。


2

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

        mListView.smoothScrollToPosition(mAdapter.getCount());

1

当您想从listview标头中聚焦edittext时,此方法效果很好

listview.setSelectionFromTop(0,0);

如果要从列表视图中选择特定的索引视图,则

listview.setSelection(index); // o for top
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.