Android ListView滚动到顶部

时间:2010-05-22 21:14:39

标签: android listview

我有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)的调用。一世 发现这表现得相当糟糕。 新生成的列表显示其滚动位置不变 并且在滚动回到顶部之前有相当长的延迟。

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

非常感谢任何帮助。

谢谢!

8 个答案:

答案 0 :(得分:128)

致电listView.setSelectionAfterHeaderView();以滚动到顶部

答案 1 :(得分:101)

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

list.smoothScrollToPosition(0);

答案 2 :(得分:39)

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

对我来说很好。

答案 3 :(得分:5)

如果您需要在ListView适配器数据更改后立即滚动,请注意它可能尚未填充。在这种情况下,您应post() setSelection()setSelectionAfterHeaderView()通过Handler,以便稍后在队列中调用。

listView.Handler.post(new Runnable() {
            @Override
            public void run() {
                listView.setSelectionAfterHeaderView();    
            }
        });

这对我有用。

答案 4 :(得分:4)

就个人而言,我建议您找到不同的UI模式。用户可能会发现您当前的“点击,列表更改 in situ ”方法直观,但我持怀疑态度。

您可以尝试继承ListView并覆盖layoutChildren()以链接到超类,然后在需要的情况下调用setSelection(0)。如果“相当大的延迟”仅由post()电话引起,则应将其清除。

答案 5 :(得分:2)

作为一种变通方法,您可以创建一个包含新重新生成数据的新适配器,然后调用ListView.setAdapter。之后调用ListView.setSelection(n)。

顺便说一句,commonsware提供的解决方案已经完成。

答案 6 :(得分:1)

关于一些不同的要求。 如果你想像聊天一样向上滚动。

        mListView.smoothScrollToPosition(mAdapter.getCount());

答案 7 :(得分:0)

当您要从列表视图标题中突出显示编辑文本时,此方法效果很好

listview.setSelectionFromTop(0,0);

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

listview.setSelection(index); // o for top