Szukam sposobu przewijania a, RecyclerView
aby wyświetlić wybrany element na górze.
W sposób ListView
udało mi się to zrobić przy użyciu scrollTo(x,y)
i coraz górną część elementu, które muszą być skoncentrowany.
Coś jak:
@Override
public void onItemClick(View v, int pos){
mylistView.scrollTo(0, v.getTop());
}
Problem polega na tym, że RecyclerView
zwraca błąd przy użyciu scrollTo
metody mówiąc
RecyclerView nie obsługuje przewijania do absolutnej pozycji
Jak mogę przewinąć a, RecyclerView
aby umieścić wybrany element u góry widoku?
źródło
Jeśli szukasz pionowego programu LinearLayout Manager, możesz uzyskać płynne przewijanie za pomocą niestandardowego
LinearSmoothScroller
:użyj instancji menedżera układu w widoku recyklingu, a następnie wywołanie
recyclerView.smoothScrollToPosition(pos);
spowoduje płynne przewinięcie do wybranej pozycji do góry widoku recykleraźródło
getHorizontalSnapPreference()
Zastępuję również w TopSnappedSmoothScroller dla list poziomych.RecyclerView
? To znaczy: nie wydają się działać na ostatniej pozycji - niezależnie odSNAP_TO_START
tychRecyclerView
tylko przewija aż element staje się widoczny na dole, ale nie przenieść go przez całą drogę w górę. Wszelkie pomysły, jak to osiągnąć? (Pracowałem nad tym, ustawiając niestandardowe wypełnienie na,RecyclerView
ale to nie wydaje się naprawdę właściwe ...)// Przewiń pozycję poz
źródło
Musisz tylko zadzwonić
recyclerview.scrollToPosition(position)
. W porządku!Jeśli chcesz wywołać go w adapterze, po prostu pozwól, aby adapter miał instancję recyclinglerview lub działanie lub fragment, który zawiera recyclinglerview, niż implementuje
getRecyclerview()
w nich metodę .Mam nadzieję, że ci to pomoże.
źródło
to samo z regulatorem prędkości
źródło
Spróbuj tego, co dla mnie zadziałało.
Utwórz zmienną
private static int displayedposition = 0;
Teraz dla pozycji twojego RecyclerView w twojej działalności.
Umieść to oświadczenie w miejscu, w którym chcesz umieścić poprzednią witrynę wyświetlaną w twoim widoku.
Cóż, to wszystko, działało dobrze dla mnie \ o /
źródło
po prostu wywołaj tę metodę po prostu:
zamiast:
źródło
co zrobiłem, aby przywrócić pozycję przewijania po odświeżeniu RecyclerView po kliknięciu przycisku:
pobranie przesunięcia pierwszego widocznego elementu od góry przed utworzeniem obiektu linearLayoutManager, a po jego utworzeniu wywołano scrollToPositionWithOffset obiektu LinearLayoutManager.
źródło
Nie wiem, dlaczego nie znalazłem najlepszej odpowiedzi, ale jest ona naprawdę prosta.
Bez błędów
Tworzy animacje
źródło
przewiń w określonej pozycji,
a to pomogło mi dużo. poprzez kliknięcie nasłuchiwacza możesz uzyskać pozycję w adapterze
źródło
źródło
Żadna z odpowiedzi nie wyjaśnia, jak wyświetlać ostatnie elementy na górze. Tak więc odpowiedzi działają tylko w przypadku przedmiotów, które wciąż mają wystarczającą liczbę elementów powyżej lub poniżej nich, aby wypełnić pozostałe
RecyclerView
. Na przykład, jeśli jest 59 elementów i wybrano 56. element, powinien on znajdować się na górze, jak na poniższym obrazku:Możemy obsłużyć tych przypadków, używając
linearLayoutManager.scrollToPositionWithOffset(pos, 0)
i dodatkową logikę wAdapter
odRecyclerView
- dodając niestandardowe margines poniżej ostatniego elementu (jeśli ostatni element nie jest widoczny to znaczy, nie ma wystarczająco dużo miejsca wypełnićRecyclerView
). Niestandardowy margines może być różnicą między wysokością widoku głównego a wysokością elementu. Tak, TwójAdapter
naRecyclerView
wyglądałby następująco:źródło
W moim przypadku
RecyclerView
mam taki wyściełany topNastępnie, aby przewinąć element do góry, muszę
źródło
Jeśli
LayoutManager
jestLinearLayoutManager
użyćscrollToPositionWithOffset(position,0);
na nim i sprawi, że Twoja pozycja pierwszy widoczny element na liście. W przeciwnym razie, można użyćsmoothScrollToPosition
naRecyclerView
wprost.Skończyło się na użyciu poniższego kodu.
źródło
Korzystam z poniższego kodu, aby płynnie przewijać element (thisView) do góry.
Działa również dla GridLayoutManager z widokami o różnych wysokościach:
Wydaje się, że działa wystarczająco dobrze, aby uzyskać szybkie rozwiązanie.
źródło
thisPosition
?