8

Questa è più simile a una domanda generica, ma dopo molte ricerche e tentativi non riesco a capire perché sia ​​così difficile da raggiungere. This è la risposta più vicina che riesca a trovare ma che ancora non riesco a implementare.Come far scorrere RecyclerView senza problemi?

Per essere precisi sto utilizzando RecyclerView con GridLayoutManager. Tutto quello che voglio è che il layout della griglia scorra senza problemi (come l'app gallary di default), niente di particolare, ma l'implementazione di default del gestore della griglia fa scorrere la vista in modo 'a scatti'. Ho provato a implementare il metodo dal link sopra ma senza successo.

Ho anche provato a implementare LinearSmoothScroller ma non sono sicuro di come implementare il metodo computeScrollVectorForPosition. Google's documentation su computeScrollVectorForPosition ha letteralmente 0 parole.

Ho trovato this 3 part tutorial, ma era di pochissimo aiuto. Quindi, tutto quello che voglio chiedere è: può esserci qualche tipo di codice template che possiamo implementare in LinearSmoothScroller o estendere RecyclerView.SmoothScroller e ottenere uno scrolling regolare? Anche se il codice dipende dal numero di oggetti e articoli per riga in griglia, ci deve essere un metodo per farlo facilmente. Mi sto perdendo qualcosa qui?

+0

- forse dovresti determinare perché il tuo codice esistente è "a scatti", usando strumenti come Traceview, 'StrictMode', e così via. – CommonsWare

+0

@commonsWare Quindi, l'implementazione predefinita di GridLayoutManager dovrebbe scorrere la griglia senza problemi? Mi dispiace se suono noob, sono abbastanza nuovo per Android Programming. – rockfight

+4

"Quindi intendi l'implementazione di default di GridLayoutManager dovrebbe scorrere la griglia senza problemi?" - Sì, almeno per la mia definizione di "senza problemi". La tipica fonte di scorrimento "a scatti" in Android è che l'app impiega troppo tempo nel thread dell'applicazione principale aggiornando l'interfaccia utente. Nel caso di 'RecyclerView', ciò significherebbe impiegare troppo tempo in' onBindViewHolder() 'o possibilmente in' onCreateViewHolder() '. Ognuno di questi ha bisogno di tornare in tempi inferiori al millisecondo, il che significa che non è possibile eseguire I/O su disco o I/O di rete. – CommonsWare

risposta

28

La tipica fonte di scorrimento "a scatti" in Android è che l'app impiega troppo tempo sul thread dell'applicazione principale aggiornando l'interfaccia utente. Nel caso di RecyclerView, ciò significherebbe impiegare troppo tempo in onBindViewHolder() o eventualmente in onCreateViewHolder(). Ognuno di questi ha bisogno di tornare in tempi inferiori al millisecondo, il che significa che non è possibile eseguire I/O su disco o I/O di rete.

penso di aver trovato il problema. Sto usando holder.photo.setImageBitmap (BitmapFactory.decodeFile (itemList.get (position) .get AbsolutePath())); su onBindViewHolder() e il file di immagine è di circa 100kb ognuna con circa una dozzina di immagini nell'elenco

Sì, che saranno facendo disco I/O e l'immagine decodifica sul thread principale dell'applicazione. Sarà abbastanza lento da causare jank nell'interfaccia utente (ad esempio lo scorrimento "a scatti").

Considerare l'utilizzo di una libreria di caricamento di immagini, come Picasso o Universal Image Loader, in quanto possono popolare il proprio ImageView dalla bitmap in modo asincrono.

This sample app utilizza Universal Image Loader per popolare il contenuto di un RecyclerView (con GridLayoutManager), con l'origine dati che sono i video disponibili sul dispositivo.

+0

Grazie, controllerò e implementerò. Nel frattempo, che ne dici di usare [this] (http://developer.android.com/training/displaying-bitmaps/load-bitmap.html) una soluzione semplice anziché utilizzare una libreria separata? – rockfight

+0

@rockfight: perché questo ha poco a che fare con il tuo problema. L'obiettivo di questa pagina è l'efficienza della memoria, non il tempo di thread dell'applicazione principale. – CommonsWare

+0

UIL non funziona mentre l'immagine risiede nella scheda sd (il percorso del file inizia con '/ storage'. Ho usato' Glide' per questo scopo e ha fornito una soluzione perfetta al mio problema – Rajat

-1

basta aggiungere questa

animateLayoutChanges = true 

in recyclerview xml

+2

quindi qual è? –

1
android:animateLayoutChanges="false" 
+2

quindi qual è? –

12

Aggiungere questo ovunque si è dichiarato recyclerview nella vostra attività o Frammento

RecyclerView mRecyclerview = (RecyclerView) findViewById(...); 
mRecyclerview.setNestedScrollingEnabled(false); 

setNestedScrollview (false) fa il lavoro per te.

0

Ho appena affrontato questo problema e disabilitando lo scorrimento annidato l'ho risolto. fare in questo modo:

yourRecyclerview.setNestedScrollingEnabled(false); 

Oppure si può cambiare il valore nel file XML in cui è stata definita RecyclerView: "Mi manca qualcosa qui"

<android.support.v7.widget.RecyclerView 
    android:id="@+id/yourRecyclerView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:nestedScrollingEnabled="false"/> 
Problemi correlati