W RecyclerView mogę nagle przewinąć do góry wybranego elementu, używając:
((LinearLayoutManager) recyclerView.getLayoutManager()).scrollToPositionWithOffset(position, 0);
Jednak powoduje to gwałtowne przeniesienie elementu na najwyższą pozycję. Chcę płynnie przejść na górę elementu .
Próbowałem też:
recyclerView.smoothScrollToPosition(position);
ale nie działa dobrze, ponieważ nie przenosi elementu na wybraną pozycję na górę. Po prostu przewija listę, aż pozycja na pozycji jest widoczna.
protected int getHorizontalSnapPreference() { return LinearSmoothScroller.SNAP_TO_START; }
. Ponadto musiałem wdrożyć metodę abstrakcyjnąpublic PointF computeScrollVectorForPosition(int targetPosition) { return layoutManager.computeScrollVectorForPosition(targetPosition); }
.w tym celu musisz utworzyć niestandardowy LayoutManager
użyj tego dla swojego RecyclerView i wywołaj smoothScrollToPosition.
przykład:
spowoduje to przewinięcie do góry elementu RecyclerView o określonej pozycji.
mam nadzieję że to pomoże.
źródło
smoothScrollToPosition
. Dlaczego ten problem może wystąpić? Dzięki.To jest funkcja rozszerzenia, którą napisałem w Kotlinie do użycia z
RecyclerView
(na podstawie odpowiedzi @Paul Woitaschek):Użyj tego w ten sposób:
źródło
Możemy spróbować w ten sposób
źródło
Zastąp funkcję CalcDyToMakeVisible / calcDxToMakeVisible w LinearSmoothScroller, aby zaimplementować przesunięcie pozycji Y / X
źródło
Najłatwiejszy sposób przewijania a
RecyclerView
jest następujący:źródło
Użyłem w ten sposób:
źródło
Dzięki @droidev za rozwiązanie. Jeśli ktoś szuka rozwiązania Kotlin, skieruj to:
źródło
CustomLinearLayout.kt:
Uwaga: Powyższy przykład jest ustawiony na kierunek HORIZONTAL, możesz przejść VERTICAL / HORIZONTAL podczas inicjalizacji.
Jeśli ustawisz kierunek na PIONOWY , powinieneś zmienić „ wyliczenieDxToMakeVisible ” na „ wyliczenieDyToMakeVisible ” (pamiętaj również o zwracanej wartości wywołania supertype)
Activity / Fragment.kt :
źródło
Prawdopodobnie podejście @droidev jest poprawne, ale chcę po prostu opublikować coś nieco innego, co zasadniczo wykonuje tę samą pracę i nie wymaga rozszerzenia LayoutManager.
UWAGA - to zadziała dobrze, jeśli Twój element (ten, który chcesz przewinąć na górze listy) jest widoczny na ekranie i chcesz po prostu automatycznie przewinąć go na górę. Jest to przydatne, gdy ostatnia pozycja na liście ma jakąś akcję, która dodaje nowe pozycje na tej samej liście i chcesz skupić użytkownika na nowo dodanych pozycjach:
Pomysł jest prosty: 1. Musimy uzyskać górną współrzędną elementu widoku recyklingu; 2. Musimy uzyskać górną współrzędną elementu widoku, który chcemy przewinąć do góry; 3. Na koniec z obliczonym offsetem musimy zrobić
200 to tylko przykład zakodowanej na stałe wartości całkowitej, której możesz użyć, jeśli element podglądu nie istnieje, ponieważ jest to również możliwe.
źródło
Chcę pełniej zająć się kwestią czasu trwania przewijania , który, jeśli wybierzesz jakąkolwiek wcześniejszą odpowiedź, w rzeczywistości będzie się znacznie różnić (i niedopuszczalnie) w zależności od ilości przewijania niezbędnego do osiągnięcia pozycji docelowej z bieżącej pozycji.
Aby uzyskać jednolity czas przewijania, prędkość (w pikselach na milisekundę) musi uwzględniać rozmiar każdego pojedynczego elementu - a gdy elementy mają niestandardowe wymiary, dodaje się zupełnie nowy poziom złożoności.
Być może dlatego programiści RecyclerView wdrożyli zbyt trudny koszyk dla tego istotnego aspektu płynnego przewijania.
Zakładając, że chcesz pół-uniform czas przewijania i że lista zawiera pół-jednolite elementy a następnie trzeba będzie coś takiego.
PS: Przeklinam dzień, w którym zacząłem bezkrytycznie konwertować ListView do RecyclerView .
źródło
Możesz odwrócić swoją listę
list.reverse()
i ostatecznie zadzwonićRecylerView.scrollToPosition(0)
źródło