Muszę wiedzieć, które elementy są obecnie wyświetlane w moim RecyclerView. Nie ma odpowiednika OnScrollListener.onScroll(...)
metody w ListViews. Próbowałem z tym pracować View.getGlobalVisibleRect(...)
, ale ten hack jest zbyt brzydki i nie zawsze też działa.
Ktoś jakieś pomysły?
android
android-recyclerview
rekire
źródło
źródło
getItemCount
może zwrócić 1 ifindFirstVisibleItemPosition
-1 dla tego samego połączenia.Wreszcie znalazłem rozwiązanie pozwalające stwierdzić, czy bieżący element jest widoczny, na podstawie zdarzenia onBindViewHolder w adapterze.
Kluczem jest metoda isViewPartIALVisible z LayoutManager.
W adapterze możesz pobrać LayoutManager z RecyclerView, który otrzymasz jako parametr ze zdarzenia onAttachedToRecyclerView .
źródło
dla tych, którzy mają logikę, która ma zostać zaimplementowana w adapterze RecyclerView, możesz nadal korzystać z podejścia @ernesto w połączeniu z funkcją scrollListener, aby uzyskać dostęp
what you want
do RecyclerView. Wewnątrz adaptera znajdziesz coś takiego:źródło
Możesz użyć,
recyclerView.getChildAt()
aby uzyskać każde widoczne dziecko, a ustawienie taguconvertview.setTag(index)
w tym widoku w kodzie adaptera pomoże ci powiązać go z danymi adaptera.źródło
recyclerView.getChildAt()
, tak na ogółRecyclerView
działa.RecyclerView
spróbuje zatrzymać tylko kilka widoków potomnych, które są obecnie widoczne (tj. w granicach ekranu, a nie Widoczność jako BRAK, NIEWIDOCZNE) i spróbuje przetworzyć te widoki, gdy użytkownik przewinie.Linear / Grid LayoutManager
Aby sprawdzić, które elementy są, można zastosować następujące metodyvisible
a jeśli chcesz śledzić
is item visible on screen
dla pewnego progu, możesz odnieść się do następującego bloga.https://proandroiddev.com/detecting-list-items-perceived-by-user-8f164dfb1d05
źródło
Uzupełnienie :
Proponowane funkcje findLast ... position () ma nie działać prawidłowo w scenariuszu z paska narzędzi zapadającego natomiast pasek narzędzi jest rozszerzony.
Wygląda na to, że widok recyklera ma stałą wysokość i podczas gdy pasek narzędzi jest rozwinięty, recykler jest przesuwany w dół, częściowo poza ekran. W konsekwencji wyniki proponowanych funkcji są zbyt wysokie. Przykład: Mówi się, że ostatnim widocznym przedmiotem jest numer 9, ale w rzeczywistości element 7 jest ostatnim, który jest na ekranie.
To zachowanie jest również przyczyną, dla której mój widok często nie przewijał się do prawidłowej pozycji, tj. ScrollToPosition () nie działał poprawnie (w końcu programowo zwinąłem pasek narzędzi).
źródło
Aby
StaggeredGridLayoutManager
to zrobić:Aby uzyskać widoczne widoki elementów:
Pamiętaj, aby sprawdzić, czy jest pusty.
źródło
viewsIds
jest tablicą i może być pusta.