scrollBy funktioniert in der geschachtelten Recycleransicht nicht ordnungsgemäß

8

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 Sie scrollen also nicht. Aber warum ? und warum andere arbeiten?

  • Wie kann ich das beheben?
  • Ist onViewAttachedToWindow der richtige Ort, um neue angehängte RecyclervViews zu scrollen?

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     
ziLk 29.06.2017, 08:09
quelle

1 Antwort

4
___ tag123scroll ___ Scrolling bezieht sich auf das kontinuierliche Verschieben von Inhalten über einen Bildschirm. ___ tag123android ___ Android ist das mobile Betriebssystem von Google, das zum Programmieren oder Entwickeln von digitalen Geräten (Smartphones, Tablets, Automobile, Fernseher, Wear, Glass, IoT) verwendet wird. Verwenden Sie für Themen rund um Android Android-spezifische Tags wie android-intent, nicht intent, android-activity, nicht activity, android-adapter, nicht adapter usw. Bei anderen Fragen als der Entwicklung oder Programmierung, aber im Zusammenhang mit Android Framework, verwenden Sie Der Link: https://android.stackexchange.com. ___ qstnhdr ___ scrollBy funktioniert in der geschachtelten Recycleransicht nicht ordnungsgemäß ___ tag123androidrecyclerview ___ Das RecyclerView Widget ist eine erweiterte und flexible Version von ListView. ___ answer44964714 ​​___

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.

%Vor%

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 !!

    
___ qstntxt ___

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 Sie scrollen also nicht. Aber warum ? und warum andere arbeiten?

  • Wie kann ich das beheben?
  • Ist onViewAttachedToWindow der richtige Ort, um neue angehängte RecyclervViews zu scrollen?

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üfen     
___
ziLk 07.07.2017, 07:14
quelle