2015-05-20 13 views
6

Sto lavorando con RecyclerView e con un LinearLayoutManager corrispondente. Stavo aggiungendo alcune funzioni di scorrimento personalizzate a una parte della mia app in cui avrei tradotto un oggetto di intestazione personalizzato insieme al rotolo di RecyclerView modellato dopo questo progetto: https://github.com/boxme/ParallaxHeaderViewPager (che utilizza ListView anziché RecyclerView).RecyclerView LinearLayoutManager computeVerticalScrollOffset() che non restituisce il valore corretto

Mi sono imbattuto in un problema strano però. Scorrerebbe per un po ', ma poi salterà di qualche centinaio di pixel. Ho aggiunto istruzioni di registro per vedere l'offset calcolato da LinearLayoutManager.computeVerticalScrollOffset() mentre eseguivo lo scorrimento come abbastanza sicuro, l'offset si spostava in modo casuale da 320 a 1200, quindi continuava a calcolare l'offset in modo appropriato da quel punto.

Vedere la mia risposta qui sotto su come ho risolto questo!

risposta

5

Il problema è stato il fatto di avere un elemento invisibile molto grande nella mia lista seguito da un mucchio di oggetti più piccoli. Si scopre che LinearLayoutManager.computeVerticalScrollOffset() prende in considerazione l'altezza di riga media altezza riga durante il calcolo. Questo ha causato un problema per me dal momento che quell'elemento di grandi dimensioni in alto stava eliminando l'altezza media delle file. Alla fine ho risolto questo problema aggiungendo alcuni elementi invisibili più piccoli in cima invece di uno più grande per mantenere l'altezza della riga media accurata.

Spero che questo aiuti chiunque abbia di fronte un problema simile!

+1

Invece di farlo, è possibile eseguire l'override di 'computeVerticalScrollOffset',' extent' e 'range' per una soluzione più economica e corretta. – yigit

+0

Questa è una grande idea! Ero un po 'diffidente nei confronti dei metodi RecyclerView e LayoutManager, in quanto le classi sono ancora relativamente nuove e potrebbero cambiare in modo significativo in futuro. Sono d'accordo che la mia soluzione era sul lato hacker ma almeno dovrebbe funzionare anche se la classe cambia in futuro :) – rakoonise

+0

Questi metodi sono specchi di View così improbabile da modificare. Inoltre, quando cambiamo un metodo pubblico, proviamo a renderlo compatibile all'indietro se possibile – yigit

Problemi correlati