2010-05-22 609 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());