Chciałbym przewinąć do dołu listy RecyclerView po załadowaniu działania.
GENERIC_MESSAGE_LIST = (ArrayList) intent.getExtras().getParcelableArrayList(ConversationsAdapter.EXTRA_MESSAGE);
conversationView = (RecyclerView) findViewById(R.id.list_messages);
conversationView.setHasFixedSize(true);
conversationViewLayoutManager = new LinearLayoutManager(this);
conversationView.setLayoutManager(conversationViewLayoutManager);
conversationViewAdapter = new ConversationAdapter(GENERIC_MESSAGE_LIST, this);
conversationView.setAdapter(conversationViewAdapter);
conversationView.scrollTo(...)
zgłasza wyjątek dotyczący braku obsługi w RecyclerView i conversationView.scrollToPosition(...)
wydaje się, że nic nie robi.
Po powyższym bloku kodu dodałem
conversationView.scrollToPosition(GENERIC_MESSAGE_LIST.size() + 1)
co nie działa. W. Jest 30 elementów GENERIC_MESSAGE_LIST
.
java
android
scroll
android-recyclerview
waylaidwanderer
źródło
źródło
scrollToPosition
natychmiast po ustawieniu adaptera?conversationView.setAdapter(conversationViewAdapter);
.Odpowiedzi:
Po prostu ustaw
setStackFromEnd=true
lubsetReverseLayout=true
tak, aby LLM układał elementy od końca.Różnica między tymi dwoma polega na tym
setStackFromEnd
, że widok zostanie ustawiony tak, aby pokazywał ostatni element, a kierunek układu pozostanie taki sam. (Tak więc w poziomym widoku Recyklera od lewej do prawej ostatni element zostanie wyświetlony, a przewijanie w lewo pokaże wcześniejsze elementy)Natomiast
setReverseLayout
zmieni kolejność elementów dodawanych przez Adapter. Układ rozpocznie się od ostatniego elementu, który będzie znajdował się najbardziej na lewo w widoku LTR Recycler, a następnie przewijanie w prawo pokaże wcześniejsze elementy.Próba:
Szczegółowe informacje można znaleźć w dokumentacji .
źródło
Patrzyłem na ten post, aby znaleźć odpowiedź, ale ... Myślę, że wszyscy w tym poście mieli ten sam scenariusz co ja:
scrollToPosition()
został całkowicie zignorowany z oczywistego powodu.Czego używałem?
... co DZIAŁAŁO ?
źródło
recyclerView.scrollToPosition(messages.size()-1);
naprawdę działa na mnie, po prostu zastanawiam się, dlaczego.smoothScrollToPosition(...)
.Wiem, że jest późno na odpowiedź tutaj, ale jeśli ktoś chce wiedzieć, rozwiązanie jest poniżej
źródło
conversationView.smoothScrollToPosition(conversationView.getAdapter().getItemCount() **-1**);
tak, jak pozycje na listach są od zera.Aby przewinąć z dowolnej pozycji w widoku recyklingu do dołu
źródło
Dodaj ten kod po wysłaniu wiadomości i przed odebraniem wiadomości z serwera
źródło
Kiedy dzwonisz
setAdapter
, nie powoduje to natychmiastowego układania i pozycjonowania elementów na ekranie (co wymaga pojedynczego przejścia układu), dlatego teżscrollToPosition()
wywołanie nie ma żadnych elementów do przewinięcia, gdy je wywołujesz.Zamiast tego powinieneś zarejestrować ViewTreeObserver.OnGlobalLayoutListener (przez addOnGlobalLayoutListner () z
ViewTreeObserver
utworzonego przezconversationView.getViewTreeObserver()
), który opóźnia twój czasscrollToPosition()
do pierwszego przebiegu układu:źródło
OnGlobalLayoutListener
prawdopodobnie nie zostanie usunięty, ponieważ sprawdzaszvto.isAlive()
. Nie znam powodu, aleViewTreeObserver
czasami jest zamieniany na aView
, więc zamiast sprawdzaćisAlive
, lepiej po prostu pobierz aktualnyViewTreeObserver
zconversationView.getViewTreeObserver().removeGlobalOnLayoutListener
Rozwiązanie dla Kotlin :
zastosuj poniższy kod po ustawieniu „recyclinglerView.adapter” lub po „reclerView.adapter.notifyDataSetChanged ()”
źródło
W Kotlinie:
źródło
GlobalLayoutListener
! Po refaktoryzacji musiałem użyć twojej metody do przewijania. Nie zapomnij usunąć nasłuchiwania, jak w stackoverflow.com/questions/28264139/… , albo nie przewiniesz RecyclerView z powrotem do początku.i
powyższy kod działa, ale nie jest płynny ani fajny.
źródło
JEŚLI masz dołączony adapter z recyklerem, po prostu zrób to.
mRecyclerView.smoothScrollToPosition(mRecyclerView.getAdapter().getItemCount());
źródło
Odpowiedź Roc jest bardzo pomocna. Chciałbym dodać do niego mały blok:
źródło
W moim przypadku, gdy widoki nie mają tej samej wysokości, wywołanie scrollToPosition w LayoutManager działało, aby naprawdę przewinąć do dołu i zobaczyć w pełni ostatni element:
źródło
U mnie to działa doskonale:
źródło
Przewiń po raz pierwszy przy pierwszym wejściu do widoku recyklera, a następnie użyj
wstaw minus, aby przewinąć w dół, aby przewinąć w górę, wstaw wartość dodatnią);
jeśli widok ma bardzo dużą wysokość, wówczas położenie przewijania do pozycji, określone przesunięcie jest używane do widoku z góry
źródło
Tylko odpowiedź Iana umożliwiła mi
RecyclerView
przewinięcie do określonej pozycji. JednakRecyclerView
nie był w stanie przewijać później, kiedy użyłemscrollToPosition()
.smoothScrollToPosition()
działało, ale początkowa animacja działała zbyt wolno, gdy lista była długa. Powodem było to, że słuchacz nie został usunięty. Użyłem poniższego kodu, aby usunąć prądViewTreeObserver
i zadziałało to jako urok.źródło
ten kod da ci najpierw najnowszy post, myślę, że ta odpowiedź jest pomocna.
źródło
Wypróbowałem metodę @galex , działała do refaktoryzacji. Więc użyłem odpowiedzi @yanchenko i trochę się zmieniłem. Prawdopodobnie dzieje się tak dlatego, że wywołałem scrolling
onCreateView()
, skąd został zbudowany widok fragmentu (i prawdopodobnie nie miał odpowiedniego rozmiaru).Możesz również dodać czek
viewTreeObserver.isAlive
podobny do https://stackoverflow.com/a/39001731/2914140 .źródło
Jeśli żaden z nich nie zadziałał,
powinieneś spróbować użyć:
Robiąc to, żądasz wyświetlenia określonego ConstraintLayout (lub cokolwiek innego). Zwój jest natychmiastowy.
Pracuję nawet z pokazaną klawiaturą.
źródło