Ich muss wissen, welche Elemente derzeit in meiner RecyclerView angezeigt werden. Es gibt kein Äquivalent zumOnScrollListener.onScroll(...)
Methode in ListViews. Ich habe versucht, damit zu arbeiten View.getGlobalVisibleRect(...)
, aber dieser Hack ist zu hässlich und funktioniert nicht immer auch.
Jemand irgendwelche Ideen?
android
android-recyclerview
rekire
quelle
quelle
getItemCount
kann 1 undfindFirstVisibleItemPosition
-1 bei demselben Anruf zurückgeben.Schließlich fand ich eine Lösung, um anhand des onBindViewHolder-Ereignisses im Adapter zu ermitteln, ob das aktuelle Element sichtbar ist.
Der Schlüssel ist die Methode isViewPartiallyVisible von LayoutManager.
In Ihrem Adapter können Sie den LayoutManager aus der RecyclerView abrufen , die Sie als Parameter aus dem Ereignis onAttachedToRecyclerView erhalten .
quelle
Für diejenigen, die eine Logik haben, die im RecyclerView-Adapter implementiert werden soll, können Sie weiterhin den @ vernesto-Ansatz in Kombination mit einem on scrollListener verwenden, um zu erfahren,
what you want
wie RecyclerView konsultiert wird. Im Adapter befindet sich etwa Folgendes:quelle
Sie können
recyclerView.getChildAt()
jedes sichtbareconvertview.setTag(index)
untergeordnete Element abrufen. Wenn Sie in dieser Ansicht im Adaptercode ein Tag festlegen, können Sie es mit den Adapterdaten verknüpfen.quelle
recyclerView.getChildAt()
, so funktioniert das im AllgemeinenRecyclerView
.RecyclerView
wird versuchen, nur wenige untergeordnete Ansichten zu speichern, die derzeit sichtbar sind (dh innerhalb der Bildschirmgrenzen, nicht Sichtbarkeit als GEGANGEN, UNSICHTBAR), und versuchen, diese Ansichten zu recyceln, wenn der Benutzer einen Bildlauf durchführt.Die folgenden
Linear / Grid LayoutManager
Methoden können verwendet werden, um zu überprüfen, welche Elemente vorhanden sindvisible
Wenn Sie
is item visible on screen
einen bestimmten Schwellenwert ermitteln möchten, können Sie auf den folgenden Blog verweisen.https://proandroiddev.com/detecting-list-items-perceived-by-user-8f164dfb1d05
quelle
Nachtrag :
Die vorgeschlagenen Funktionen findlast ... Position () nicht nicht korrekt funktionieren in einem Szenario mit einer kollabierenden Symbolleiste , während die Symbolleiste erweitert wird.
Es scheint, dass die Recycler-Ansicht eine feste Höhe hat, und während die Symbolleiste erweitert wird, wird der Recycler teilweise außerhalb des Bildschirms nach unten verschoben. Infolgedessen sind die Ergebnisse der vorgeschlagenen Funktionen zu hoch. Beispiel: Das letzte sichtbare Element soll # 9 sein, aber tatsächlich ist Element # 7 das letzte, das auf dem Bildschirm angezeigt wird.
Dieses Verhalten ist auch der Grund, warum meine Ansicht oft nicht zur richtigen Position gescrollt hat, dh scrollToPosition () hat nicht richtig funktioniert (ich habe die Symbolleiste schließlich programmgesteuert reduziert).
quelle
Dafür
StaggeredGridLayoutManager
:Und um sichtbare Objektansichten zu erhalten:
Denken Sie daran, zu überprüfen, ob es leer ist.
quelle
viewsIds
ist ein Array und kann leer sein.