[英]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.