Android ListView nach oben scrollen


80

Ich habe eine ListViewmit benutzerdefinierten Zeilen. Wenn Sie auf eine dieser Zeilen klicken, werden die ListView-Daten neu generiert. Ich möchte, dass die Liste in diesem Fall wieder nach oben rollt.

Ich habe anfangs versucht, setSelection(0)in jeder Zeile zu verwenden OnClickListener , um dies zu erreichen, war jedoch erfolglos (ich glaube, weil der ListView seine Bildlaufposition verliert, wenn seine Daten ungültig werden - daher wird mein Aufruf von setSelection rückgängig gemacht. Ich verstehe immer noch nicht, wie die ListView entscheidet, wohin sie scrollen soll nach der Ungültigmachung).

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

Es beinhaltet ( View.post) den Aufruf von _listView.setSelection(0). Ich fand das ziemlich schlecht. Die neu generierte Liste wird mit unveränderter Bildlaufposition angezeigt, und es gibt eine erhebliche Verzögerung, bevor sie wieder nach oben scrollt.

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

Jede Hilfe wäre sehr dankbar.

Vielen Dank!

Antworten:


132

Rufen Sie listView.setSelectionAfterHeaderView();an, um nach oben zu scrollen


66
Genau so hätte ich es genannt.
Markshiz

102

Ich habe viel versucht, aber dieser hat für mich funktioniert

list.smoothScrollToPosition(0);

3
Das ist fantastisch. Ich frage mich, ob Sie die Bildlaufgeschwindigkeit ändern können.
Theblang

Kann es auch einen Rückruf geben, um zu erfahren, wann der Scoll endet, damit ich zum nächsten Bildschirm navigieren kann?
Amol Gupta

41

Ich benutze einfach listview.setSelection(0);

Funktioniert gut für mich.


5

Wenn Sie unmittelbar nach ListViewdem Ändern der Adapterdaten einen sofortigen Bildlauf benötigen , achten Sie darauf, dass diese möglicherweise noch nicht ausgefüllt sind. In diesem Fall sollten Sie post()Ihre setSelection()oder setSelectionAfterHeaderView()über Handlerso, dass es später in der Warteschlange aufgerufen wird.

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

Das hat bei mir funktioniert.


4

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

Sie können versuchen, Unterklassen zu ListViewerstellen und zu überschreiben, layoutChildren()um sie mit der Oberklasse zu verketten, und dann setSelection(0)den Fall aufrufen, in dem dies erforderlich ist. Wenn die "erhebliche Verzögerung" nur auf den post()Anruf zurückzuführen ist, sollte dies behoben werden.


4
Vielen Dank für den Vorschlag, ich werde es bald versuchen. Die Liste wird vor Ort 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. Vielen Dank auch für ALLE Ihre Hilfe. Ich habe einige Ihrer Stackoverflow-Antworten und Ihre CommonsWare-Literatur gelesen und sie haben mir beim Einstieg in diese Plattform erheblich geholfen!
Aakash

Dies ist der Weg, keine magischen Methoden, nur reine Logik. Vielen Dank!
Leo unterstützt Monica Cellio

2

Um dieses Problem zu umgehen, können Sie einen neuen Adapter erstellen, der die neuen regenerierten Daten enthält, und dann ListView.setAdapter aufrufen. Rufen Sie danach ListView.setSelection (n) auf.

Übrigens funktioniert die von Commonsware bereitgestellte Lösung.


2

Auf eine andere Anforderung. Wenn Sie wie beim Chatten nach oben scrollen möchten.

        mListView.smoothScrollToPosition(mAdapter.getCount());

1

Dieser hat gut funktioniert, wenn Sie den Edittext aus dem Listenansicht-Header fokussieren möchten

listview.setSelectionFromTop(0,0);

Wenn Sie die bestimmte Indexansicht aus der Listenansicht auswählen möchten, dann

listview.setSelection(index); // o for top
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.