Mam ListView
z 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.post
to 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!
Wiele próbowałem, ale ten zadziałał dla mnie
list.smoothScrollToPosition(0);
źródło
Po prostu używam
listview.setSelection(0);
U mnie działa dobrze.
źródło
Jeśli potrzebujesz natychmiastowego przewijania zaraz po
ListView
zmianie danych karty, zwróć uwagę, że może nie być jeszcze wypełniony. W takim przypadku powinieneśpost()
swójsetSelection()
lubsetSelectionAfterHeaderView()
przez,Handler
wię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.
źródło
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
ListView
i 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 tylkopost()
wezwaniem, powinno to wyjaśnić sprawę.źródło
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.
źródło
Na inne wymaganie. Jeśli chcesz przewijać w górę, tak jak podczas rozmowy.
mListView.smoothScrollToPosition(mAdapter.getCount());
źródło
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
źródło