Ich habe ein vertikal scrollendes RecyclerView
mit horizontal scrollenden inneren RecyclerViews genau so.
Mit dieser Implementierung können Benutzer jede horizontale Recycleransicht synchron durchlaufen. Wenn ein Benutzer jedoch vertikal zur übergeordneten Recycleransicht blättert, wird eine neue horizontale Recycleransicht, die gerade an das Fenster angefügt wurde, nicht an der gleichen Scroll-X-Position angezeigt. Das ist normal. Weil es gerade erstellt wurde.
Also hatte ich versucht, zu der Scroll-Position zu scrollen, bevor sie angezeigt wurde. Einfach so:
Hinweis : Dies ist der Adapter des übergeordneten Recycler-Views, dessen Ausrichtung vertikal ist.
%Vor% Wie Sie sehen, wirkt sich scrollBy
nicht auf Zeile 10 , Zeile 11 , Zeile 12 und Zeile aus 13 Danach debuggte ich den Code, um herausfinden zu können, was passiert. Wenn ich mit scrollBy die Bildlaufposition einstelle, gibt childCount () null für Zeile 10 , Zeile 11 , Zeile 12 und Zeile 13
Hinweis : Ich habe auch scrollToPosition()
getestet, es wird kein Problem wie dieses bekommen. Aber ich kann es bei meinem Fall nicht verwenden. Weil Benutzer zu irgendeiner x-Position scrollen können, die möglicherweise nicht die genaue Position hat. Also muss ich die Scroll-Position mit dem x-Wert anstelle der Position einstellen.
Bearbeiten : Sie können den Quellcode
überprüfen Ich habe eine Lösung gefunden, die scrollToPositionWithOffset
method benutzt anstatt scrollBy
. Auch wenn beide von zwei eine andere Position scrollen, haben sie wirklich einen anderen Arbeitsprozess auf der Rückseite.
Beispiel: Wenn Sie versuchen, scrollBy
zu verwenden, um eine Pixelposition zu scrollen, und Ihr recyclerView keinen Adapter festgelegt hat, was bedeutet, dass keine Daten angezeigt werden und daher noch keine Elemente vorhanden sind, dann scrollBy
funktioniert nicht. RecyclerView verwendet die scrollBy
-Methode des LayoutManagers. In meinem Fall verwende ich LinearLayoutManager
für die horizontalen RecyclerViews.
Lass uns sehen, was es macht:
%Vor% Wie Sie sehen können, ignoriert scrollBy
die Scrollabsichten, wenn zu diesem Zeitpunkt kein Kind vorhanden ist.
Andererseits kann scrollToPosition
auch dann perfekt arbeiten, wenn noch keine Set-Daten vorliegen.
Laut der Pro RecyclerView-Folie , die unter Beispiel funktioniert perfekt. Mit scrollBy ist das nicht möglich.
%Vor% Als Ergebnis habe ich etwas geändert, um scrollToPositionWithOffset()
zu verwenden.
Vor dieser Implementierung habe ich die exakte Scroll-x-Position als Pixel berechnet.
Danach, wenn der Scroll in den Leerlaufzustand kam, Berechnung der ersten vollständigen sichtbaren Position bis zum ersten Parameter von scrollToPositionWithOffset()
.
Für den zweiten Parameter, der der Offset ist, erhalte ich den Wert mit view.getLeft()
function, was hilft, die linke Position dieser Ansicht relativ zu ihrem Elternteil zu erhalten.
Und es funktioniert perfekt !!
Ich habe ein vertikal scrollendes %code% mit horizontal scrollenden inneren RecyclerViews genau so.
Mit dieser Implementierung können Benutzer jede horizontale Recycleransicht synchron durchlaufen. Wenn ein Benutzer jedoch vertikal zur übergeordneten Recycleransicht blättert, wird eine neue horizontale Recycleransicht, die gerade an das Fenster angefügt wurde, nicht an der gleichen Scroll-X-Position angezeigt. Das ist normal. Weil es gerade erstellt wurde.
Also hatte ich versucht, zu der Scroll-Position zu scrollen, bevor sie angezeigt wurde. Einfach so:
Hinweis : Dies ist der Adapter des übergeordneten Recycler-Views, dessen Ausrichtung vertikal ist.
%Vor% Wie Sie sehen, wirkt sich %code% nicht auf Zeile 10 , Zeile 11 , Zeile 12 und Zeile aus 13 Danach debuggte ich den Code, um herausfinden zu können, was passiert. Wenn ich mit scrollBy die Bildlaufposition einstelle, gibt childCount () null für Zeile 10 , Zeile 11 , Zeile 12 und Zeile 13
Hinweis : Ich habe auch %code% getestet, es wird kein Problem wie dieses bekommen. Aber ich kann es bei meinem Fall nicht verwenden. Weil Benutzer zu irgendeiner x-Position scrollen können, die möglicherweise nicht die genaue Position hat. Also muss ich die Scroll-Position mit dem x-Wert anstelle der Position einstellen.
Bearbeiten : Sie können den Quellcode
überprüfenTags und Links android scroll android-recyclerview