2015-05-20 1 views
6

Ich arbeite mit einem RecyclerView und einem entsprechenden LinearLayoutManager. Ich habe einige benutzerdefinierte Scroll-Funktionen zu einem Teil meiner App hinzugefügt, wo ich ein benutzerdefiniertes Header-Objekt zusammen mit dem Scroll des RecyclerView nach diesem Projekt modellieren würde: https://github.com/boxme/ParallaxHeaderViewPager (das ListView anstelle von RecyclerView verwendet).RecyclerView LinearLayoutManager computeVerticalScrollOffset() liefert keinen korrekten Wert

Ich lief jedoch in einem seltsamen Problem. Es würde für eine Weile gut laufen, aber dann würde es ein paar hundert Pixel springen. Ich habe log-Anweisungen hinzugefügt, um den Offset zu sehen, der von LinearLayoutManager.computeVerticalScrollOffset() berechnet wurde, während ich so oft scrollte, dass der Offset zufällig von 320 auf 1200 sprang, dann würde er den Offset von diesem Punkt aus berechnen.

Siehe meine Antwort unten, wie ich das gelöst habe!

Antwort

5

Das Problem endete damit, dass ich einen sehr großen unsichtbaren Gegenstand in meiner Liste hatte, gefolgt von einer Reihe kleinerer Gegenstände. Es stellt sich heraus, dass LinearLayoutManager.computeVerticalScrollOffset() durchschnittliche Zeilenhöhe bei der Berechnung berücksichtigt. Dies verursachte ein Problem für mich, da dieser große Gegenstand an der Spitze die durchschnittliche Höhe der Reihen abwarf. Ich habe das gelöst, indem ich ein paar kleinere unsichtbare Elemente an der Spitze hinzugefügt habe, anstatt eine große, um die durchschnittliche Zeilenhöhe genau zu halten.

Ich hoffe, das hilft jedem, der ein ähnliches Problem hat!

+1

Anstatt dies zu tun, könnten Sie 'computeVerticalScrollOffset',' extent' und 'range' für eine billigere und geeignetere Lösung überschreiben. – yigit

+0

Das ist eine großartige Idee! Ich war etwas skeptisch gegenüber RecyclerView und LayoutManager-Methoden, da die Klassen noch relativ neu sind und sich in der Zukunft signifikant ändern könnten. Ich stimme zu, meine Lösung war auf der Hacker-Seite, aber zumindest sollte es noch funktionieren, wenn sich die Klasse in der Zukunft ändert :) – rakoonise

+0

Diese Methoden sind Spiegel von View, also sehr, sehr unwahrscheinlich, zu ändern. Wenn wir eine öffentliche Methode ändern, versuchen wir, sie möglichst rückwärtskompatibel zu machen – yigit