繁体   English   中英

Android ListView滚动到顶部

[英]Android ListView scrolling to top

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

我最初尝试在每一行的OnClickListener使用setSelection(0)来实现这一点但是不成功(我相信因为ListView在其数据无效时丢失了它的滚动位置 - 所以我对setSelection的调用被撤消。我仍然不明白但是,ListView决定在失效后滚动到的位置。

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

它涉及( View.post )对_listView.setSelection(0)的调用。 我觉得这个表现很糟糕。 新生成的列表显示其滚动位置不变,并且在滚动回到顶部之前存在相当大的延迟。

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

任何帮助将非常感激。

谢谢!

call listView.setSelectionAfterHeaderView(); 滚动到顶部

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

list.smoothScrollToPosition(0);

我只使用listview.setSelection(0);

对我来说很好。

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

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

这对我有用。

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

您可以尝试继承ListView并重写layoutChildren()以链接到超类,然后在需要的情况下调用setSelection(0) 如果“相当大的延迟”仅仅是由post()调用引起的,那么这应该清除它。

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

顺便说一句,commonsware提供的解决方案是有效的。

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

        mListView.smoothScrollToPosition(mAdapter.getCount());

当你想从listview标题聚焦edittext时,这个工作正常

listview.setSelectionFromTop(0,0);

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM