Android ListView滚动到顶部

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

我最初尝试在每行的OnClickListener使用setSelection(0)来实现这一目标,但不成功(我相信因为当数据无效时ListView失去滚动位置 – 所以我对setSelection的调用被取消了。虽然ListView决定在无效后滚动到哪里)。

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

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

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

任何帮助将非常感激。

谢谢!

调用listView.setSelectionAfterHeaderView(); 滚动到顶部

我尝试了很多,但是这个为我工作

 list.smoothScrollToPosition(0); 

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

为我工作得很好。

就我个人而言,我build议你找一个不同的UI模式。 用户可能会发现你目前的“点击,列表更改原位 ”的方法直观,但我很怀疑。

您可以尝试inheritanceListView并重写layoutChildren()以链接到超类,然后在需要的情况下调用setSelection(0) 。 如果“相当大的延迟”是由于post()调用所致,则应该将其清除。

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

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

这对我有效。

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

顺便说一句,由commonsware提供的解决scheme工作。

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

  mListView.smoothScrollToPosition(mAdapter.getCount());