RecyclerView: finden Letzte sichtbare Objekt sofort nach Ansicht erstellt
Ich habe ein problem mit einer der folgenden Methoden:
int firstVisibleItemPosition = gridLayoutManager.findFirstVisibleItemPosition();
int lastVisibleItemPosition = gridLayoutManager.findLastVisibleItemPosition();
Mein Ziel: speichern analytische Daten darüber, welche Elemente dem Benutzer angezeigt haben.
Damit zu tun, dass, rufe ich diese Methoden in zwei verschiedenen Szenarien:
- jedes mal, wenn scrollen aktiviert, um den "Leerlauf" - Zustand, und zu prüfen, was sind die sichtbaren Elemente. in diesem Fall bin ich immer die erwarteten Indizes.
- wenn die
RecyclerView
"sichtbar" für den Benutzer.
nun, das ist, wenn das problem beginnt. Ich würde erwarten, dass, wenn das fragment mit der recylcerView übergebenonResume()
dann ruftfindLastVisibleItemPosition()
zurück, die sichtbaren Elemente. aber es -1 zurück, in diesem Fall. Ich denke, Sie haben etwas zu tun mit dem asynchronen laden der recyclerView + adapter-interne Elemente der Initialisierung relativ zu dem fragment/activity lifecycle.
durch verschieben dieser code von ein paar Millisekunden - findLastVisibleItemPosition()
gibt die richtigen Indizes. aber ich will nicht zu verschieben ist hart codiert mit hf + verzögert ausführbar, weil Planung verzögert ausführbar " ist ein work-around zu dem, was ich wirklich tun will: erkennen, Wann der recycler Ansicht fertig aufblasen und zeichnen auf dem Bildschirm alle sichten, die Füße nach innen von ihm..
also meine Fragen sind im Grunde:
- wie kann ich erkennen, Wann die RecyclerView beendet alle initialzation/mess - /aufblasen und Zeichnung der es untergeordnete Elemente, die Füße in den Bildschirm? (vor der Benutzer-Interaktion..).
- gibt es eine zuverlässige gute Praxis Weg, genau zu wissen, welche Elemente innerhalb des " recycler Blick ist wirklich auf dem Bildschirm angezeigt?
meine Lösung ist die Ausführung des code-Kontrolle für die erste sichtbare Element aus einem Thread als post, die durch einen handler im UI thread (nicht verzögert ..). Der Grund, warum es ausgeführt wird, auf dem Ende der UI-queue, die aus meiner Erfahrung passiert, nachdem der Blick bereits mit dem recycler anzeigen
InformationsquelleAutor Tal Kanel | 2015-07-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was über änderungen an der Konfiguration? Wenn der Benutzer ändert die Ausrichtung des Bildschirms, die sichtbaren Elemente auch ändern. Die Tatsache ist, sichtbare Elemente verändern sich ständig nach dem Stand der
RecyclerView
, die geladenen Daten, die scroll-position und die aktuelle Bildschirm-Konfiguration.Die beste Sache, die Sie wahrscheinlich tun, ist das erstellen einer Klasse, die ständig verfolgt die Obermenge von Elementen, indem es die Umsetzung der
ItemDecoration
- Schnittstelle, die aufgerufen wird, jedes mal, wenn einRecyclerView
wird neu gezeichnet auf dem Bildschirm, und haben diese Komponente senden, die Statistiken in regelmäßigen Abständen. Sie würden anfügen der neuenRecyclerView
Instanz auf Konfiguration ändern (ohne dabei den Staat).So zum Beispiel diese Komponente konnte verfolgen der minimalen und maximalen Positionen sichtbar. Es wird zunächst -1 für beide. Dann, nachdem die Daten geladen sind und die ersten Elemente werden auf dem Bildschirm angezeigt, die
ItemDecoration
wird wieder aufgerufen, und die erste sichtbare Element position werden nun die 0 und die Letzte sichtbare position wird nun N. Nach Blättern, die Werte werden sich wieder ändern. Sie würde nur halten Sie den min-Wert von FirstVisibleItemPosition und den max-Wert von LastVisibleItemPosition, um die Obermenge. Nach X Sekunden ohne Veränderungen, oder wenn der Benutzer zurück navigiert von der Aktivität, die Sie aufnehmen möchten, und senden Sie diese zahlen.onBindViewHolder
um zu überprüfen, welche Elemente gebunden sind (angezeigt) und aus, die bestimmen, welche Elemente nicht angezeigt.InformationsquelleAutor BladeCoder
Verwenden OnChildAttachListener zu erkennen, wenn eine der recycler anbringen einer neuen Halterung. Verwenden Sie einen delay-Mechanismus, um die richtige analitycs (\nicht hardcoded delaybut so etwas wie dieses:
Die 25ms Verzögerung zuverlässiger Befestigung ot der onResume willkürlich.
InformationsquelleAutor EE66
Zur Beantwortung Ihrer ersten Frage. Die beste Lösung für dieses problem, das ich gefunden ist, um layout-change-listener auf einem recycler anzeigen:
Als für die zweite Frage. Sie können getChildCount() & getChildAt(int), um Informationen über die angeschlossenen untergeordneten Ansicht zu recyclerView, aber es bedeutet nicht, dass Sie sichtbar sind auf dem Bildschirm (Sie können ein wenig off-screen). Um zu überprüfen, ob Sie sichtbar sind, siehe Android: wie Sie überprüfen, wenn Sie eine Ansicht innerhalb der ScrollView sichtbar ist?
InformationsquelleAutor pjanecze