2015-02-15 16 views
96

ho recentemente imbattuto l'androide RecycleView che è stato rilasciato con Android 5.0 e sembra che RecycleView è solo un incapsulato tradizionale ListView con il modello ViewHolder incorporato in esso, che promuove il riutilizzo della vista, piuttosto che la creazione ogni volta.Android Recyclerview vs ListView con Viewholder

Quali sono gli altri vantaggi dell'utilizzo di RecycleView? Se entrambi hanno lo stesso effetto in termini di prestazioni, perché si dovrebbe scegliere di utilizzare RecycleView`?

Modifica

ho trovato che le persone hanno chiesto domanda simile e le risposte non sono conclusivi, l'aggiunta di loro qui per la tenuta dei registri.

Recyclerview vs Listview

Should we use RecyclerView to replace ListView?

Why doesn't RecyclerView have onItemClickListener()? and How RecyclerView is different from Listview?

+4

Perché il 'RecyclerView' è molto più veloce e più versatile con un'API molto migliore. Cose come animare l'aggiunta o la rimozione di oggetti sono già implementate in 'RecyclerView' senza che tu debba fare nulla. Non c'è dubbio, gettare il 'ListView' nel cestino, il' RecyclerView' è qui per rubare lo spettacolo. –

+4

È possibile associare un gestore di layout a RecyclerView, quindi non sono limitati agli elenchi a scorrimento verticale. Questa è una funzionalità aggiuntiva abbastanza potente. – Alan

+0

@Alan - Cosa intendi con "non limitato agli elenchi a scorrimento verticale"? Stai dicendo che Recycle View può anche fungere da "segnaposto" per Gridviews e ListViews? –

risposta

209

Con l'avvento di Android Lollipop, la RecyclerView ha fatto la sua strada ufficialmente. Il RecyclerView è molto più potente, flessibile e un importante miglioramento su ListView. Proverò a darti una visione dettagliata di ciò.

1) ViewHolder Motivo

in una lista, è stato suggerito l'uso del modello ViewHolder ma non era mai una costrizione. In caso di RecyclerView, questo è obbligatorio utilizzando la classe RecyclerView.ViewHolder. Questa è una delle principali differenze tra ListView e RecyclerView.

Rende le cose un po 'più complesse in RecyclerView ma un sacco di problemi che abbiamo affrontato in ListView sono risolti in modo efficiente.

2) LayoutManager

Questo è un altro miglioramento massiccia portato al RecyclerView. In un controllo ListView, l'unico tipo di visualizzazione disponibile è il ListView verticale. Non esiste un modo ufficiale per implementare un ListView orizzontale.

Ora utilizzando un RecyclerView, possiamo avere un

i) LinearLayoutManager - che supporta entrambe le liste verticali e orizzontali,

ii) StaggeredLayoutManager - che sostiene Pinterest come liste sfalsati,

iii) GridLayoutManager - che supporta la visualizzazione delle griglie come mostrato nelle app Galleria.

E la cosa migliore è che possiamo fare tutto questo dinamicamente come vogliamo.

3) Animator Articolo

ListViews mancano a sostegno delle buone animazioni, ma il RecyclerView porta una nuova dimensione ad esso. Utilizzando la classe RecyclerView.ItemAnimator, animare le visualizzazioni diventa molto semplice e intuitivo.

4) Decorazioni Articolo

In caso di ListViews, decorando in modo dinamico elementi come l'aggiunta di bordi o divisori è mai stato facile.Ma nel caso di RecyclerView, la classe RecyclerView.ItemDecorator offre un enorme controllo agli sviluppatori, ma rende le cose un po 'più lunghe e complesse.

5) OnItemTouchListener

di intercettazione clic su un elemento ListView era semplice, grazie alla sua interfaccia AdapterView.OnItemClickListener. Ma il RecyclerView dà molto più potere e controllo ai suoi sviluppatori dal RecyclerView.OnItemTouchListener ma complica un po 'le cose per lo sviluppatore.

In parole semplici, RecyclerView è molto più personalizzabile rispetto a ListView e offre molto controllo e potenza ai suoi sviluppatori.

+17

Buona risposta. Un paio di ulteriori vantaggi in più: RecyclerView prepara la visualizzazione poco prima e dietro le voci visibili, il che è ottimo se si stanno recuperando bitmap in background. Le prestazioni sono notevolmente più veloci, soprattutto se si utilizza RecyclerView.setHasFixedSize. Il vecchio ListView si basa sul presupposto che non è possibile precalcolare o memorizzare nella cache la dimensione delle voci nell'elenco, il che causa complicazioni insanabili durante lo scorrimento e l'esecuzione del layout. Ci vuole un po 'per abituarsi, ma una volta fatto, non tornerai mai indietro. –

+0

@RobinDavies Punto eccellente. Grazie per l'informazione. Ma non avrà senso se le dimensioni degli articoli sono diverse. –

+0

@AritraRoy Supporti Recyclerview solo su lecca-lecca o api 14+ (Android 4+) anche ... .... come leggo "dopo lecca-lecca: nella maggior parte dei posti –

7

Un altro vantaggio di usare RecycleView è l'animazione, si può fare in due righe di codice

RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator(); 
     recyclerView.setItemAnimator(itemAnimator); 

Ma il widget è ancora grezzo Ad esempio, non è possibile creare l'intestazione e footer.

+3

E non sarai mai in grado di creare intestazione e piè di pagina in questo senso. Sono solo altri tipi di visualizzazione nell'adattatore. La visualizzazione elenco avvolge l'adattatore in ['HeaderViewListAdapter'] (http://developer.android.com/reference/android/widget/HeaderViewListAdapter.html) e aggiunge il supporto dell'intestazione in background. Con 'RecyclerView' sei tu a controllarlo. –

8

Va bene così po 'di scavare e ho trovato queste gemme da Bill Philips article su RecycleView

RecyclerView può fare più di ListView, ma la classe RecyclerView stessa ha meno responsabilità rispetto ListView. Fuori dalla scatola, RecyclerView non lo fa:

  • posizionare gli elementi sullo schermo
  • animare vista
  • gestire qualsiasi eventi touch oltre a scorrimento

Tutto questa roba era cotta per ListView, ma RecyclerView utilizza invece le classi di collaboratore per svolgere questi lavori.

Anche i ViewHolder creati sono più resistenti. Essi sottoclasse RecyclerView.ViewHolder, che ha un mucchio di metodi RecyclerView usi. ViewHolders sapere a quale posizione sono attualmente associati, come e quali id ​​oggetto (se ne hai). Nel processo, ViewHolder è stato nominato cavaliere. Un tempo era il lavoro di ListView per conservare la vista intera articolo e ViewHolder trattenuto solo su piccoli frammenti.

Ora, ViewHolder aggrappa a tutto nel ViewHolder.itemView campo, che viene assegnato nel costruttore di ViewHolder per voi.

4

Altro da Bill Phillip's articolo (vai a leggere!) Ma ho pensato che fosse importante sottolineare quanto segue.

In ListView, c'era una certa ambiguità su come gestire gli eventi click: Qualora le singole viste gestire questi eventi, o dovrebbe la ListView gestirli attraverso OnItemClickListener? In RecyclerView, tuttavia, ViewHolder si trova in una posizione chiara per agire come un oggetto controller a livello di riga che gestisce tali tipi di dettagli.

Abbiamo visto in precedenza che LayoutManager gestiva le viste di posizionamento e ItemAnimator gestiva animandole. ViewHolder è l'ultimo pezzo: è responsabile della gestione di qualsiasi evento che si verifica su un elemento specifico visualizzato da RecyclerView.

3

Ho utilizzato uno ListView con caricatore di immagini Glide, con una crescita della memoria. Quindi ho sostituito lo ListView con uno RecyclerView. Non è solo più difficile nella codifica, ma porta anche a un maggiore utilizzo della memoria rispetto a uno ListView. Almeno, nel mio progetto.

In un'altra attività ho utilizzato un elenco complesso con EditText's. In alcuni di essi un metodo di input può variare, anche un TextWatcher può essere applicato. Se ho utilizzato uno ViewHolder, come è possibile sostituire uno TextWatcher durante lo scorrimento? Quindi, ho usato uno ListView senza uno ViewHolder e funziona.

+0

* Ho usato un ListView senza ViewHolder e funziona. * Idea terribile ... * come posso sostituire TextWatcher durante lo scorrimento?* non c'è bisogno di sostituirlo ... solo TextWacher dovrebbe mettere i dati in contenitori diversi dopo il riutilizzo ... e può essere fatto davvero facile – Selvin

+0

@Selvin, grazie per la tua opinione. Ora non posso modificare quel progetto. C'erano diversi 'TextWatcher's su uno schermo. Probabilmente hai ragione, ma non posso verificarlo. – CoolMind

Problemi correlati