2015-05-20 14 views
6

Pracuję z RecyclerView i odpowiednim LinearLayoutManager. Dodałem niektóre niestandardowe funkcje przewijania do części mojej aplikacji, w których tłumaczyłem niestandardowy obiekt nagłówka wraz ze zwinięciem RecyclerView wzorowanym na tym projekcie: https://github.com/boxme/ParallaxHeaderViewPager (który wykorzystuje ListView zamiast RecyclerView).RecyclerView LinearLayoutManager computeVerticalScrollOffset() nie zwraca poprawnej wartości

Wpadłem jednak na dziwny problem. Przez jakiś czas przewijał się dobrze, ale potem przeskoczyłby kilkaset pikseli. Dodałem wyciągi z dziennika, aby zobaczyć przesunięcie obliczone przez LinearLayoutManager.computeVerticalScrollOffset(), gdy przewijałem wystarczająco dokładnie, przesunięcie losowo przeskakiwało z około 320 na 1200, a następnie kontynuowałoby obliczanie przesunięcia odpowiednio od tego punktu.

Zobacz poniżej odpowiedź na pytanie, jak to rozwiązałem!

Odpowiedz

5

Problem polegał na tym, że na mojej liście znalazłem bardzo duży, niewidoczny element, a za nim kilka mniejszych przedmiotów. Okazuje się, że LinearLayoutManager.computeVerticalScrollOffset() bierze pod uwagę średnią wysokość wiersza podczas obliczania. Spowodowało to dla mnie problem, ponieważ ten duży przedmiot na górze wyrzucał średnią wysokość rzędów. W końcu rozwiązałem to, dodając kilka mniejszych niewidocznych przedmiotów na górze zamiast jednego dużego, aby utrzymać średnią wysokość wiersza.

Mam nadzieję, że pomoże to każdemu, kto ma podobny problem!

+1

Zamiast tego, można zastąpić 'computeVerticalScrollOffset',' extent' i 'range', aby uzyskać tańsze i bardziej odpowiednie rozwiązanie. – yigit

+0

To świetny pomysł! Byłem trochę nieufny wobec nadpisywania metod RecyclerView i LayoutManager, ponieważ klasy są wciąż stosunkowo nowe i mogą się znacznie zmienić w przyszłości. Zgadzam się, że moje rozwiązanie było bardziej nieprzyjemne, ale przynajmniej powinno nadal działać, jeśli klasa zmieni się w przyszłości :) – rakoonise

+0

Te metody są lustrami z widoku tak bardzo mało prawdopodobne, aby się zmienić. Ponadto, gdy zmieniamy metodę publiczną, staramy się ją w miarę możliwości kompatybilować wstecznie – yigit

Powiązane problemy