2010-05-22 146 views
75

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

我最初尝试使用中的每一行的OnClickListener 实现这一setSelection(0)但没有成功(我相信,因为ListView 失去时,它的数据是无效的滚动位置 - 所以我到 为setSelection调用撤消我仍不很不过了解ListView 如何决定无效后滚动到哪里)。

唯一的工作解决我所知道的是由罗曼盖伊这里给出: http://groups.google.com/group/android-developers/browse_thread/thread/127ca57414035301

它涉及(View.post)荷兰国际集团在调用_listView.setSelection(0)。我 发现这表现相当差。 新生成的列表显示其滚动位置不变 并且在滚动回顶端之前存在相当大的延迟。

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

任何帮助将不胜感激。

谢谢!

回答

4

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

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

+4

感谢您的建议,我会尽快给您一个答案。 由于面包屑显示在屏幕的其他位置,因此该列表在原位发生了更改 - 典型的Android UI设计不太适合我的特定UI目标和目标用户。 此外,感谢您的所有帮助 - 我已阅读了一些您的stackoverflow答案和您的CommonsWare文献,他们已经大大帮助我在这个平台上开始! – aakash 2010-05-23 00:25:30

+0

这是做到这一点的方法,没有神奇的方法,只是纯粹的逻辑。谢谢! – 2014-05-01 06:50:16

2

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

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

120

呼叫listView.setSelectionAfterHeaderView();滚动到顶部

+59

这正是我所说的。 – markshiz 2012-10-10 18:10:38

+0

非常适合我! – 2013-12-08 03:02:31

+0

工作就像魅力ü救了我的一天... – 2017-09-05 06:33:22

39

我简单地使用listview.setSelection(0);

工作正常,我。

97

我已经试过很多,但对我来说

list.smoothScrollToPosition(0); 
+3

仅供参考:需要API 8+ – iTurki 2013-08-11 10:52:37

+0

@iturki:亚,这是正确的,感谢提及。 – N20084753 2013-08-14 03:43:07

+3

这太棒了。我想知道你是否可以改变滚动速度。 – theblang 2013-11-14 22:37:03

5

这个工作。如果你只需要后ListView适配器的数据被更改即时滚动,注意,这可能不是尚未填充。在这种情况下,您应该post()您的setSelection()setSelectionAfterHeaderView()通过Handler因此它将在队列中稍后调用。

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

这对我有效。

1

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

 mListView.smoothScrollToPosition(mAdapter.getCount());