Android ListView przewijanie do góry


80

Mam ListViewz niestandardowymi rzędami. Po kliknięciu dowolnego z tych wierszy dane ListView są ponownie generowane. Chciałbym, aby w takim przypadku lista przewijała się z powrotem na górę.

Początkowo próbowałem użyć setSelection(0)w każdym wierszu, OnClickListener aby to osiągnąć, ale nie powiodło się (uważam, że ListView traci pozycję przewijania, gdy jego dane są unieważnione - więc moje wywołanie setSelection jest cofane.Nadal nie rozumiem, w jaki sposób ListView decyduje, gdzie przewinąć po unieważnieniu).

Jedyne działające rozwiązanie, które znam, podał Romain Guy tutaj: http://groups.google.com/group/android-developers/browse_thread/thread/127ca57414035301

Obejmuje View.postto wezwanie do _listView.setSelection(0). Zauważyłem, że działa to dość słabo. Nowo wygenerowana lista pojawia się z niezmienioną lokalizacją przewijania i występuje znaczne opóźnienie, zanim przewinie się z powrotem na górę.

Czy jest lepszy sposób na osiągnięcie tej funkcjonalności?

Każda pomoc byłaby bardzo mile widziana.

Dzięki!

Odpowiedzi:


132

zadzwoń, listView.setSelectionAfterHeaderView();aby przewinąć do góry


66
dokładnie tak bym to nazwał.
— markshiz

102

Wiele próbowałem, ale ten zadziałał dla mnie

list.smoothScrollToPosition(0);

3
To jest niesamowite. Zastanawiam się, czy możesz zmienić prędkość przewijania.
— theblang

Czy może istnieć również oddzwonienie, aby wiedzieć, kiedy przewijanie się kończy, aby móc przejść do następnego ekranu?
— Amol Gupta

41

Po prostu używam listview.setSelection(0);

U mnie działa dobrze.


5

Jeśli potrzebujesz natychmiastowego przewijania zaraz po ListViewzmianie danych karty, zwróć uwagę, że może nie być jeszcze wypełniony. W takim przypadku powinieneś post()swój setSelection()lub setSelectionAfterHeaderView()przez, Handlerwięc zostanie wywołany później w kolejce.

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

To zadziałało dla mnie.


4

Osobiście polecam znaleźć inny wzorzec interfejsu użytkownika. Możliwe, że użytkownicy uznają Twoje obecne „kliknięcie, a lista zmienia się na miejscu ” za intuicyjne, ale jestem sceptyczny.

Możesz spróbować podklasy ListViewi nadpisanie, layoutChildren()aby przejść do nadklasy, a następnie wywołać setSelection(0)w przypadku, gdy jest to potrzebne. Jeśli „znaczne opóźnienie” jest spowodowane tylko post()wezwaniem, powinno to wyjaśnić sprawę.


4
Dzięki za sugestię, niedługo spróbuję. Lista jest zmieniana na miejscu, ponieważ menu nawigacyjne jest wyświetlane w innym miejscu na ekranie - typowe projekty interfejsu użytkownika Androida są mniej dopasowane do moich konkretnych celów interfejsu użytkownika i docelowych użytkowników. Dziękuję również za WSZYSTKĄ twoją pomoc - przeczytałem wiele twoich odpowiedzi na stackoverflow i twoją literaturę CommonsWare, i znacznie pomogli mi w rozpoczęciu korzystania z tej platformy!
— aakash

to jest sposób na zrobienie tego, żadnych magicznych metod, tylko czysta logika. Dzięki!
— Leo wspiera Monikę Cellio

2

Aby obejść ten problem, możesz utworzyć nowy adapter zawierający nowe ponownie wygenerowane dane, a następnie wywołać ListView.setAdapter. po tym wywołaniu ListView.setSelection (n).

przy okazji, rozwiązanie dostarczone przez oprogramowanie wspólne działa.


2

Na inne wymaganie. Jeśli chcesz przewijać w górę, tak jak podczas rozmowy.

        mListView.smoothScrollToPosition(mAdapter.getCount());

2

Ten działał dobrze, gdy chcesz skupić edittext z nagłówka listy

listview.setSelectionFromTop(0,0);

Jeśli chcesz wybrać konkretny widok indeksu z widoku listy, to

listview.setSelection(index); // o for top
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.