我有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)
的调用。一世
发现这表现得相当糟糕。
新生成的列表显示其滚动位置不变
并且在滚动回到顶部之前有相当长的延迟。
有没有更好的方法来实现此功能?
非常感谢任何帮助。
谢谢!
答案 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