Recyclerview Android vs ListView con Viewholder


148

Di recente mi sono imbattuto in Android RecyclerViewche è stato rilasciato con Android 5.0 e sembra che RecyclerViewsia solo un tradizionale incapsulato ListViewcon il modello ViewHolder incorporato in esso, che promuove il riutilizzo della vista, piuttosto che crearlo ogni volta.

Quali sono gli altri vantaggi dell'utilizzo RecyclerView? Se entrambi hanno lo stesso effetto in termini di prestazioni, perché preferirei RecyclerView`?

modificare

Ho scoperto che le persone hanno posto una domanda simile e le risposte non sono conclusive, aggiungendole qui per la tenuta della documentazione.

Recyclerview vs Listview

Dovremmo usare RecyclerView per sostituire ListView?

Perché RecyclerView non ha onItemClickListener ()? e in che modo RecyclerView è diverso da Listview?


4
Perché RecyclerViewè molto più veloce e versatile con un'API molto migliore. Cose come animare l'aggiunta o la rimozione di elementi sono già implementate nel RecyclerViewsenza che tu debba fare nulla. Non c'è dubbio, buttalo ListViewnel cestino, RecyclerViewè qui per rubare lo spettacolo.
Xaver Kapeller,

4
È possibile associare un gestore di layout a RecyclerView, quindi non si limitano agli elenchi a scorrimento verticale. Questa è una funzionalità aggiuntiva piuttosto potente.
Alan,

@Alan - Cosa intendi con "non limitato alle liste a scorrimento verticale"? Stai dicendo che il Recycle View può fungere da "segnaposto" anche per Gridviews e ListViews?
Mushtaq Jameel,

@XaverKapeller - Sarebbe bello se potessi elencare le differenze tra i due e rispondere alla domanda piuttosto che su un commento, in modo che possa aiutare me e gli altri in futuro che potrebbero chiedersi la stessa cosa?
Mushtaq Jameel,

@Alan - Potresti fornire qualche dettaglio su cosa intendevi e rispondere alla domanda piuttosto che su un commento. Grazie per aver
dedicato

Risposte:


289

Con l'avvento di Android Lollipop, RecyclerView si è fatto strada ufficialmente. RecyclerView è molto più potente, flessibile e rappresenta un importante miglioramento rispetto a ListView . Proverò a darti un'idea dettagliata di ciò.

1) ViewHolder Pattern

In un ListView, è stato consigliato di utilizzare il modello ViewHolder ma non è mai stata una compulsione. Nel 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 molti problemi che abbiamo affrontato in ListView sono risolti in modo efficiente.

2) LayoutManager

Questo è un altro enorme miglioramento apportato a RecyclerView. In un ListView, l'unico tipo di vista disponibile è il ListView verticale. Non esiste un modo ufficiale per implementare un ListView orizzontale.

Ora usando un RecyclerView, possiamo avere un

i) LinearLayoutManager - che supporta elenchi sia verticali che orizzontali,

ii) StaggeredLayoutManager - che supporta Pinterest come elenchi sfalsati,

iii) GridLayoutManager - che supporta la visualizzazione di griglie come si vede nelle app Galleria.

E la cosa migliore è che possiamo fare tutto ciò in modo dinamico come vogliamo.

3) Item Animator

ListView non supporta le buone animazioni, ma RecyclerView offre una dimensione completamente nuova. Utilizzando la classe RecyclerView.ItemAnimator , l'animazione delle viste diventa molto semplice e intuitiva.

4) Decorazione dell'articolo

Nel caso di ListViews, decorare dinamicamente oggetti come l'aggiunta di bordi o divisori non è mai stato facile. Ma nel caso di RecyclerView, la classe RecyclerView.ItemDecorator offre un controllo enorme agli sviluppatori ma rende le cose un po 'più lunghe e complesse.

5) OnItemTouchListener

Intercettare i clic degli articoli su ListView era semplice, grazie alla sua interfaccia AdapterView.OnItemClickListener . Ma RecyclerView offre molta più potenza e controllo ai suoi sviluppatori da parte di RecyclerView.OnItemTouchListener ( non più supportato, fare riferimento ad AndroidX ) 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.


34
Buona risposta. Un paio di ulteriori vantaggi enormi: RecyclerView prepara la vista appena avanti e dietro le voci visibili, il che è fantastico se stai 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 c'è modo di precalcolare o memorizzare nella cache la dimensione delle voci nell'elenco, il che causa complicazioni insane durante lo scorrimento e l'esecuzione del layout. Ci vuole un po 'per abituarsi, ma una volta fatto, non ci tornerai mai più.
Robin Davies,

@RobinDavies Ottimo punto. Grazie per aver informato. Ma non avrà senso se le dimensioni degli articoli sono diverse.
Aritra Roy,

@AritraRoy Recyclerview supporta solo su lollipop o anche api 14+ (android 4+)? .... mentre leggo "dopo lollipop: nella maggior parte dei luoghi
Animesh Mangla,

2
Ehi, Aritra, se paragonato a ListView, se ListView utilizza anche ViewHolder Pattern, quale agisce in modo più efficiente? Recyler visualizzerà meglio, quando si utilizza fps o altri criteri simili? thx ~
RxLeggi il

@RxRead: vedi il commento di Robin, differenzia RecyclerView Vs ListView con il modello di supporto della vista per motivi di performance.
Parag Kadam,

10

L'altro vantaggio dell'utilizzo RecycleViewè l'animazione, può essere fatto in due righe di codice

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

Ma il widget è ancora grezzo, ad esempio non è possibile creare intestazione e piè di pagina .


5
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 HeaderViewListAdaptere aggiunge il supporto dell'intestazione in background. Con RecyclerViewte hai il controllo.
Eugen Pechanec,

RecyclerView utilizza un DefaultItemAnimator per impostazione predefinita. Allora perché hai usato questo codice?
Athira Reddy,

9

Va bene così po 'di scavo e ho trovato queste gemme da Bill Philips articolo suRecycleView

RecyclerView può fare più di ListView, ma la stessa classe RecyclerView ha meno responsabilità rispetto a ListView. Immediatamente, RecyclerView non:

  • Posiziona gli elementi sullo schermo
  • Animare le viste
  • Gestisci eventuali eventi tattili oltre allo scorrimento

Tutto questo materiale è stato inserito in ListView, ma RecyclerView utilizza invece classi di collaboratori per eseguire questi lavori.

Anche i ViewHolder che crei sono più robusti. Sottoclassano RecyclerView.ViewHolder, che ha un sacco di metodi RecyclerView usati. ViewHolderssapere a quale posizione sono attualmente associati, nonché a quali ID oggetto (se ne hai). Nel processo, ViewHolder è stato nominato cavaliere. Un tempo era il lavoro di ListView per trattenere l'intera vista degli oggetti e ViewHoldersolo per piccoli pezzi.

Ora, ViewHolder tiene tutto nel ViewHolder.itemView campo, che è assegnato nel costruttore di ViewHolder per te.


4

Altro dall'articolo di Bill Phillip (vai a leggerlo!) Ma ho pensato che fosse importante sottolineare quanto segue.

In ListView, c'erano alcune ambiguità su come gestire gli eventi click: le singole viste dovrebbero gestire quegli eventi o ListView dovrebbe gestirli tramite OnItemClickListener? In RecyclerView, tuttavia, ViewHolder è in una posizione chiara per agire come un oggetto controller a livello di riga che gestisce questo tipo di dettagli.

Abbiamo visto in precedenza che LayoutManager gestiva le viste di posizionamento e ItemAnimator le gestiva animandole. ViewHolder è l'ultimo pezzo: è responsabile della gestione di tutti gli eventi che si verificano su un articolo specifico visualizzato da RecyclerView.


2

Ho usato un ListViewcaricatore di immagini con Glide, con crescita della memoria. Quindi ho sostituito il ListViewcon a RecyclerView. Non è solo più difficile nella codifica, ma porta anche a un maggiore utilizzo della memoria rispetto a ListView. Almeno, nel mio progetto.

In un'altra attività ho usato un elenco complesso con EditText's. In alcuni di essi un metodo di input può variare, anche a TextWatcherpuò essere applicato. Se avessi usato a ViewHolder, come avrei potuto sostituire a TextWatcherdurante lo scorrimento? Quindi, ho usato a ListViewsenza a ViewHolder, e funziona.


Ho usato un ListView senza ViewHolder e funziona. terribile idea ... come posso sostituire un TextWatcher durante lo scorrimento? non è necessario sostituirlo ... solo TextWacher dovrebbe inserire i dati in un contenitore diverso dopo il riutilizzo ... e può essere fatto in modo molto semplice
Selvin,

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

1

Riutilizza le celle mentre si scorre verso l'alto / il basso : questo è possibile con l'implementazione di View Holder nell'adattatore listView, ma era una cosa facoltativa, mentre in RecycleView è il modo predefinito di scrivere l'adattatore.

Disaccoppia l'elenco dal suo contenitore - in modo da poter inserire facilmente gli elementi dell'elenco in fase di esecuzione nei diversi contenitori (linearLayout, gridLayout) con l'impostazione LayoutManager.

Esempio:

mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3));
  • Anima le azioni dell'elenco comune.

  • Le animazioni vengono disaccoppiate e delegate a ItemAnimator.

C'è di più su RecyclerView, ma penso che questi punti siano quelli principali.

LayoutManager

i) LinearLayoutManager - che supporta elenchi sia verticali che orizzontali,

ii) StaggeredLayoutManager - che supporta Pinterest come elenchi sfalsati,

iii) GridLayoutManager - che supporta la visualizzazione di griglie come si vede nelle app Galleria.

E la cosa migliore è che possiamo fare tutto ciò in modo dinamico come vogliamo.


1

1. Visualizza i titolari

In ListView, la definizione dei titolari di viste era un approccio suggerito per mantenere i riferimenti per le viste. Ma non era una compulsione. Sebbene non facendolo, ListView utilizzato mostra dati non aggiornati. Un altro grave svantaggio di non utilizzare i detentori di visualizzazioni potrebbe portare a una pesante operazione di ricerca di visualizzazioni da parte degli ID ogni volta. Ciò ha comportato un rallentamento di ListView.

Questo problema è risolto in RecylerView mediante l'uso della classe RecyclerView.ViewHolder. Questa è una delle principali differenze in RecyclerView e ListView. Quando si implementa un RecyclerView, questa classe viene utilizzata per definire un oggetto ViewHolder che viene utilizzato dall'adattatore per associare ViewHolder con una posizione. Un altro punto da notare qui è che durante l'implementazione dell'adattatore per RecyclerView, è obbligatorio fornire un ViewHolder. Questo rende l'implementazione un po 'complessa, ma risolve i problemi affrontati in ListView.

2. Responsabile del layout

Quando si parla di ListView, è disponibile solo un tipo di ListView, ovvero ListView verticale. Non è possibile implementare un ListView con scorrimento orizzontale. So che ci sono modi per implementare una pergamena orizzontale, ma credetemi non è stato progettato per funzionare in quel modo.

Ma ora quando guardiamo Android RecyclerView vs ListView, abbiamo anche il supporto per le raccolte orizzontali. In realtà supporta più tipi di elenchi. Per supportare più tipi di elenchi utilizza la classe RecyclerView.LayoutManager. Questa è una novità che ListView non ha. RecyclerView supporta tre tipi di gestori layout predefiniti:

LinearLayoutManager - Questo è il gestore di layout più comunemente usato nel caso di RecyclerView. Attraverso questo, possiamo creare liste di scorrimento sia orizzontali che verticali. StaggeredGridLayoutManager: tramite questo gestore di layout, possiamo creare elenchi sfalsati. Proprio come la schermata Pinterest. GridLayoutManager– Questo gestore di layout può essere utilizzato per visualizzare griglie, come qualsiasi galleria di immagini.

3. Animatore oggetto

Le animazioni in un elenco sono una dimensione completamente nuova, che ha infinite possibilità. In un ListView, come tale, non ci sono disposizioni speciali attraverso le quali è possibile animare, aggiungere o eliminare elementi. Invece in seguito, come Android evoluto ViewPropertyAnimator è stato suggerito da Chet Haase di Google in questo tutorial video per le animazioni in ListView.

D'altra parte, confrontando Android RecyclerView con ListView, ha la classe RecyclerView.ItemAnimator per la gestione delle animazioni. Attraverso questa classe è possibile definire animazioni personalizzate per eventi di aggiunta, eliminazione e spostamento di elementi. Inoltre fornisce un DefaultItemAnimator, nel caso in cui non siano necessarie personalizzazioni.

4. Adattatore

Gli adattatori ListView erano semplici da implementare. Avevano un metodo principale getView in cui accadeva tutta la magia. Dove le opinioni erano legate a una posizione. Inoltre avevano un metodo interessante registerDataSetObserver in cui si può impostare un osservatore proprio nell'adattatore. Questa funzione è presente anche in RecyclerView, ma viene utilizzata la classe RecyclerView.AdapterDataObserver. Ma il punto a favore di ListView è che supporta tre implementazioni predefinite degli adattatori:

ArrayAdapter CursorAdapter SimpleCursorAdapter Considerando l'adattatore RecyclerView, ha tutte le funzionalità che gli adattatori ListView avevano tranne il supporto integrato per cursori DB e ArrayLists. In RecyclerView.Adapter da ora dobbiamo realizzare un'implementazione personalizzata per fornire dati all'adattatore. Proprio come un BaseAdapter fa per ListViews. Sebbene se desideri saperne di più sull'implementazione dell'adattatore RecyclerView, fai riferimento all'esempio di RecyclerView per Android.

5. Notifica della modifica dei dati

Quando si lavora con un ListView, se il set di dati viene modificato, è necessario chiamare il metodo notifyDataSetChanged dell'adattatore sottostante per aggiornare i dati. Oppure imposta il metodo setNotifyOnChange su true nel caso in cui desideri chiamare automaticamente il metodo notifyDataSetChanged. Ma in entrambi i casi il risultato è molto pesante nella lista. Fondamentalmente aggiorna le visualizzazioni dell'elenco.

Al contrario, in un adattatore RecyclerView, se un singolo articolo o un intervallo di articoli sono cambiati, ci sono metodi per notificare la modifica di conseguenza. Quelli sono notifyItemChanged e notifyItemRangeChanged rispettivamente e molti altri come:

notifyItemInsterted notifyItemMoved notifyItemRangeInsterted notifyItemRangeRemoved E, naturalmente, ha il metodo originale per aggiornare l'intero elenco, cioè notificationDataSetChanged, che notifica che è stato modificato l'intero set di dati.

6. Decorazione dell'articolo

Per visualizzare divisori personalizzati in un ListView, si sarebbe potuto facilmente aggiungere questi parametri nel XML ListView:

XHTML android: divider = "@ android: color / transparent" android: dividerHeight = "5dp" 1 2 android: divider = "@ android: color / transparent" android: dividerHeight = "5dp" La parte interessante di Android RecyclerView è che, per ora non mostra un divisore tra gli elementi per impostazione predefinita. Anche se i ragazzi di Google devono averlo lasciato fuori per la personalizzazione, intenzionalmente. Ma questo aumenta notevolmente lo sforzo per uno sviluppatore. Se si desidera aggiungere un divisore tra gli elementi, potrebbe essere necessario eseguire un'implementazione personalizzata utilizzando la classe RecyclerView.ItemDecoration.

Oppure puoi applicare un hack utilizzando questo file da esempi ufficiali: DividerItemDecoration.java

7. OnItemTouchListener

Le visualizzazioni elenco avevano una semplice implementazione per il rilevamento dei clic, ad esempio mediante l'interfaccia AdapterView.OnItemClickListener.

D'altra parte, l'interfaccia RecyclerView.OnItemTouchListener viene utilizzata per rilevare eventi touch in Android RecyclerView. Ciò complica leggermente l'implementazione, ma fornisce un maggiore controllo allo sviluppatore per l'intercettazione di eventi tattili. La documentazione ufficiale afferma che può essere utile per manipolazioni gestuali in quanto intercetta un evento touch prima che venga consegnato a RecyclerView.


1

RecyclerView è stato creato come miglioramento di ListView, quindi sì, è possibile creare un elenco allegato con il controllo ListView, ma l'utilizzo di RecyclerView è più semplice in quanto:

  1. Riutilizza le celle mentre si scorre verso l'alto / il basso : questo è possibile con l'implementazione di View Holder nell'adattatore ListView, ma era una cosa facoltativa, mentre in RecycleView è il modo predefinito di scrivere l'adattatore.

  2. Disaccoppia l'elenco dal suo contenitore : in modo da poter inserire facilmente gli elementi dell'elenco in fase di esecuzione nei diversi contenitori (linearLayout, gridLayout) con l'impostazione LayoutManager.

mRecyclerView = (RecyclerView) findViewById (R.id.my_recycler_view); mRecyclerView.setLayoutManager (nuovo LinearLayoutManager (questo)); mRecyclerView.setLayoutManager (nuovo GridLayoutManager (this, 2));

  1. Anima le azioni dell'elenco comune : le animazioni sono disaccoppiate e delegate a ItemAnimator. C'è di più su RecyclerView, ma penso che questi punti siano quelli principali.

Quindi, per concludere, RecyclerView è un controllo più flessibile per la gestione dei "dati di elenco" che segue i modelli di delega delle preoccupazioni e lascia a se stesso un solo compito: riciclare gli articoli.


0

Se usi RecycleView, per prima cosa hai bisogno di più efford per l'installazione. Devi dedicare più tempo alla configurazione di un semplice clic su elemento, bordo, evento tocco e altre cose semplici. Ma il prodotto finale sarà perfetto.

Quindi la decisione è tua. Suggerisco, se si progetta un'app semplice come il caricamento della rubrica, in cui è sufficiente un semplice clic sull'elemento, è possibile implementare la visualizzazione elenco. Ma se progetti come la home page dei social media con scorrimento illimitato. Diverse decorazioni diverse tra gli articoli, molto controllo del singolo articolo rispetto all'utilizzo della vista di riciclo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.