2010-05-22 20 views
75

Ich habe eine ListView mit benutzerdefinierten Zeilen. Wenn eine dieser Zeilen auf geklickt wird, werden die ListView-Daten neu generiert. Ich würde gerne die Liste zu scrollen zurück nach oben, wenn dies passiert.Android ListView nach oben scrollen

Ich versuchte zunächst mit setSelection(0) in jeder Zeile der OnClickListener dies zu erreichen, war aber erfolglos (ich glaube, weil die ListView seine Scroll-Position verliert, wenn seine Daten für ungültig erklärt wird -. So mein Aufruf an setSelection rückgängig gemacht wird, ich nicht noch‘ Ich verstehe, wie der ListView darüber entscheidet, wohin nach der Ungültigkeitsliste geblättert wird.

Die einzige funktionierende Lösung, die ich kenne, wurde hier von Romain Guy gegeben: http://groups.google.com/group/android-developers/browse_thread/thread/127ca57414035301

Es geht (View.post), um den Anruf zu _listView.setSelection(0) ing. I fand dies ziemlich schlecht. Die neu generierte Liste wird mit unveränderter Scroll-Position angezeigt und es gibt eine erhebliche Verzögerung, bevor es zurück nach oben scrollt.

Gibt es einen besseren Weg, diese Funktionalität zu erreichen?

Jede Hilfe würde sehr geschätzt werden.

Danke!

Antwort

4

Persönlich empfehle ich Ihnen, ein anderes UI-Muster zu finden. Es ist möglich, dass Benutzer Ihren aktuellen "Klick, und die Liste ändert in situ" Ansatz intuitiv finden, aber ich bin skeptisch.

Sie könnten Unterklasse ListView versuchen und layoutChildren() überschreiben, um an die Oberklasse zu ketten, dann rufen Sie setSelection(0) in dem Fall, wo das benötigt wird. Wenn die "erhebliche Verzögerung" nur auf den Anruf zurückzuführen ist, sollte dies aufklären.

+4

Danke für den Vorschlag, ich werde es irgendwann bald geben. Die Liste wird in situ geändert, da Breadcrumbs an anderer Stelle auf dem Bildschirm angezeigt werden - die typischen Android-UI-Designs sind für meine spezifischen UI-Ziele und Zielbenutzer weniger geeignet. Auch, vielen Dank für Ihre Hilfe - ich habe eine Reihe Ihrer Stackoverflow Antworten und Ihre CommonsWare Literatur gelesen, und sie haben mir erheblich geholfen, auf dieser Plattform zu beginnen! – aakash

+0

Das ist der Weg, es zu tun, keine magischen Methoden, nur reine Logik. Vielen Dank! –

2

als Workaround können Sie einen neuen Adapter erstellen, der die neu generierten Daten enthält, und dann ListView.setAdapter aufrufen. Nach diesem Aufruf ListView.setSelection (n).

übrigens, die von commonsware bereitgestellte Lösung wird bearbeitet.

120

Anruf listView.setSelectionAfterHeaderView(); blättern

+59

genau das hätte ich es genannt. – markshiz

+0

Arbeit gut für mich! –

+0

funktioniert wie Charme du hast meinen Tag gerettet ... –

39

nach oben einfach ich für mich listview.setSelection(0);

funktioniert gut verwenden.

97

Ich habe viel versucht, aber dies ist für mich

list.smoothScrollToPosition(0); 
+3

FYI: Erfordert API 8+ – iTurki

+0

@iturki: ya das ist richtig, danke für Erwähnung. – N20084753

+3

Das ist großartig. Ich frage mich, ob Sie die Scroll-Geschwindigkeit ändern können. – theblang

5

Wenn Sie sofortige blättern müssen nur nach ListView Daten des Adapters geändert wurden, darauf achten, dass es noch nicht besiedelt sein könnte. In diesem Fall sollten Sie post() Ihre setSelection() oder setSelectionAfterHeaderView() über Handler so wird es später in der Warteschlange aufgerufen werden.

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

Das funktionierte für mich.

1

Auf eine andere Anforderung. Wenn Sie wie beim Chatten hochscrollen möchten.

 mListView.smoothScrollToPosition(mAdapter.getCount()); 
Verwandte Themen