Ich habe eine ListView
mit 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!
Ich habe viel versucht, aber dieser hat für mich funktioniert
quelle
Ich benutze einfach
listview.setSelection(0);
Funktioniert gut für mich.
quelle
Wenn Sie unmittelbar nach
ListView
dem Ändern der Adapterdaten einen sofortigen Bildlauf benötigen , achten Sie darauf, dass diese möglicherweise noch nicht ausgefüllt sind. In diesem Fall sollten Siepost()
IhresetSelection()
odersetSelectionAfterHeaderView()
überHandler
so, dass es später in der Warteschlange aufgerufen wird.Das hat bei mir funktioniert.
quelle
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
ListView
erstellen und zu überschreiben,layoutChildren()
um sie mit der Oberklasse zu verketten, und dannsetSelection(0)
den Fall aufrufen, in dem dies erforderlich ist. Wenn die "erhebliche Verzögerung" nur auf denpost()
Anruf zurückzuführen ist, sollte dies behoben werden.quelle
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.
quelle
Auf eine andere Anforderung. Wenn Sie wie beim Chatten nach oben scrollen möchten.
quelle
Dieser hat gut funktioniert, wenn Sie den Edittext aus dem Listenansicht-Header fokussieren möchten
Wenn Sie die bestimmte Indexansicht aus der Listenansicht auswählen möchten, dann
quelle