RecyclerView vs. ListView


295

Dallo sviluppatore Android ( creazione di elenchi e carte ):

Il widget RecyclerView è una versione più avanzata e flessibile di ListView.

Va bene, sembra bello, ma quando ho visto questa immagine di esempio, mi sono davvero confuso sulla differenza tra questi due.

inserisci qui la descrizione dell'immagine

L'immagine sopra può essere facilmente creata ListViewusando l'adattatore personalizzato.

Quindi, in quale situazione si dovrebbe usare RecyclerView?



1
@ Dev786: ti suggerisco di aggiungere un commento qui spiegando in dettaglio cosa ritieni manchi dalle molte risposte esistenti su questa domanda.
CommonsWare il

Risposte:


374

RecyclerViewè stato creato come un ListViewmiglioramento, quindi sì, è possibile creare un elenco allegato con ListViewcontrollo, ma l'utilizzo RecyclerViewè più semplice in quanto:

  1. Riutilizza le celle mentre scorri verso l'alto / il basso : questo è possibile con l'implementazione di View Holder ListViewnell'adattatore, ma era una cosa facoltativa, mentre nel RecycleViewmodo 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.

Esempio:

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
  1. Anima le azioni dell'elenco comune : le animazioni vengono disaccoppiate e delegate ItemAnimator.

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

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


16
La responsabilità principale della visualizzazione elenco è 1.) organizzare visivamente gli oggetti all'interno di un'area specifica e preferibilmente 2.) riutilizzare gli oggetti. Con RecylerView questo si divide in singole responsabilità: riciclare la vista ricicla e viene fornito LayoutManager organizza gli elementi sullo schermo. In altre parole, riciclare view non sa / importa dove mettere gli oggetti sullo schermo, si occupa solo di riciclarli. Da Android Doc: "Modificando LayoutManager è possibile utilizzare un RecyclerView per implementare un elenco a scorrimento verticale standard, una griglia uniforme, griglie sfalsate, raccolte a scorrimento orizzontale e altro."
daneejela,

32
"Riutilizza le celle mentre scorri verso l'alto / il basso": per quanto ne so questo è completamente sbagliato Perché ciò accade anche nella visualizzazione elenco senza viewholder.
Ruban,

16
L'uso principale del view view in listview è Il tuo codice potrebbe chiamare findViewById () frequentemente durante lo scorrimento di ListView, il che può rallentare le prestazioni. Anche quando l'adattatore restituisce una visualizzazione gonfiata per il riciclaggio, è comunque necessario cercare gli elementi e aggiornarli. Un modo per aggirare l'uso ripetuto di findViewById () consiste nell'utilizzare il modello di progettazione "view holder". Un oggetto ViewHolder memorizza ciascuna delle viste dei componenti all'interno del campo tag del layout, in modo da poter accedere immediatamente ad esse senza la necessità di cercarle ripetutamente.
Ruban,

7
Quello che cerco di dire è che Row verrà riciclato anche quando si implementa listview senza il view viewer. Questa è la proprietà e il vantaggio di listview. Questo è ciò che hanno creato listview.
Ruban,

non hanno fatto nulla di speciale, queste funzionalità possono essere aggiunte da chiunque. puoi estendere ListView e baseAdapter e aggiungere qualsiasi funzione ad esso, se lo desideri. in realtà non c'è differenza tra questi due.
MDP,

39

Affinché le viste dell'elenco abbiano buone prestazioni, è necessario implementare il modello di supporto, ed è facile sbagliare soprattutto quando si desidera popolare l'elenco con diversi tipi di viste.

RecyclerView inserisce questo modello, rendendo più difficile sbagliare. È anche più flessibile, rendendo più semplice la gestione di layout diversi, che non sono lineari come una griglia.


6
Sì ! , ci dovrebbero essere più discussioni su quando NON usare anche recyclerview. Se le tue righe hanno contenuto aggiunto dinamicamente in base ai dati del modello e usi la vista Riciclatore, BOOM.
Rana Deep,

1
Dovresti essere in grado di aggiungere contenuti dinamici in base ai dati del modello. Devi solo impostare diverse visualizzazioni per qualsiasi tipo di contenuto che desideri supportare.
CaptRespect,

36

ListViewè l'antenato di RecyclerView. C'erano molte cose che ListViewo non facevano o non andavano bene. Se dovessi raccogliere le carenze del ListViewe risolto il problema astraggendoli in diversi domini, finiresti con qualcosa come la vista del riciclatore. Ecco i principali punti problematici con ListViews:

  • Non applicare ViewReuse per gli stessi tipi di elementi (guarda uno degli adattatori utilizzati in a ListView, se studi il metodo getView vedrai che nulla impedisce a un programmatore di creare una nuova vista per ogni riga anche se ne viene passato uno tramite la convertViewvariabile)

  • Non ha impedito gli findViewByIdusi costosi (Anche se si stavano riciclando le viste come indicato sopra, era possibile che gli sviluppatori chiamassero findViewByIdper aggiornare il contenuto visualizzato delle viste figlio. Lo scopo principale del ViewHoldermodello in ListViewsera di memorizzare nella cache le findViewByIdchiamate. Tuttavia, questo era solo disponibile se lo sapevi perché non faceva parte della piattaforma)

  • È supportato solo lo scorrimento verticale con le visualizzazioni visualizzate in riga (la vista Riciclatore non si preoccupa di dove sono posizionate le viste e di come vengono spostate, viene sottratto in un LayoutManager. Un riciclatore può quindi supportare il tradizionale ListViewcome mostrato sopra, così come cose come GridView, ma non si limita a questo, può fare di più, ma devi fare il lavoro di programmazione per farlo accadere).

  • Le animazioni aggiunte / rimosse non sono state considerate un caso d'uso. Spetta a te capire come procedere (confronta il RecyclerView. Le classi degli adattatori notificano * le offerte del metodo v. ListViews per avere un'idea).

In breve, RecyclerViewè un approccio più flessibile ListView, anche se potrebbe essere necessario eseguire più codice da parte vostra.


20

La RecyclerViewè una nuova ViewGroup che viene preparato a rendere qualsiasi visualizzazione adattatore basato in modo simile. Si suppone che sia il successore di ListView and GridView, e può essere trovato nel latest support-v7 version. The RecyclerViewè stato sviluppato pensando all'estensibilità , quindi è possibile creare qualsiasi tipo di layout che si possa pensare, ma non senza una piccola dose di dolore nel culo.

Risposta tratta da Antonio Leiva

 compile 'com.android.support:recyclerview-v7:27.0.0'

RecyclerViewè davvero un powerful viewrispetto ListView. Per maggiori dettagli puoi visitare questa pagina .


5
Mi piace questa frase dalla tua risposta: questo è Android, quindi le cose non sono mai facili Questo è vero per quello che è stato lo sviluppo di app Android, ma penso che sia solo qualcosa di sbagliato nel modo in cui hanno progettato l'API e i modelli da costruire App per Android. Teoricamente un buon design dovrebbe nascondere tutte le possibili complessità ai programmatori (ma essere comunque accessibile per quelli avanzati), ciò di cui si preoccupano di solito è la logica aziendale, i dati e altri algoritmi oltre a lottare con la gestione dei problemi relativi all'interfaccia utente (e problemi più noiosi attualmente presenti nello sviluppo Android).
Senza speranza il

18

Di seguito sono riportati alcuni punti chiave / differenze tra RecyclerView e ListView. Rispondi con saggezza alla tua chiamata.

Se ListView funziona per te, non c'è motivo di migrare. Se stai scrivendo una nuova interfaccia utente, potresti essere meglio con RecyclerView.

RecylerView ha ViewHolder integrato, non è necessario implementare il nostro like in listView. Supporta anche la notifica a un determinato indice

Cose come animare l'aggiunta o la rimozione di oggetti sono già implementate in RecyclerView senza che tu debba fare nulla

Possiamo associare un gestore di layout con un RecyclerView, questo può essere usato per ottenere viste casuali in recycleview mentre questo era un limite in ListView 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.


14

Vantaggio principale:

ViewHoldernon è disponibile per impostazione predefinita in ListView. Creeremo esplicitamente all'interno di getView(). RecyclerViewha integrato Viewholder.


4

Oltre alle differenze sopra riportate di seguito sono riportate alcune altre:

  1. RV separa la creazione della vista e l'associazione dei dati da visualizzare. In LV, è necessario verificare se convertView è nullo o meno per la creazione della vista, prima di associare i dati ad esso. Quindi, nel caso di camper, la vista verrà creata solo quando è necessario, ma in caso di LV, si può perdere il controllo per convertview e creare la vista ogni volta.

  2. Passare da Grid a List è più semplice ora con LayoutManager.

  3. Non è necessario notificare e aggiornare tutti gli articoli, anche se viene modificato solo un singolo articolo.

  4. Uno ha dovuto implementare la cache di visualizzazione in caso di LV. Viene fornito in camper per impostazione predefinita. (Esiste una differenza tra visualizzazione cache n riciclaggio.)

  5. Animazioni di oggetti molto semplici in caso di camper.


4

Vantaggi di RecyclerView su listview:

  1. Contiene ViewHolder per impostazione predefinita.

  2. Animazioni facili.

  3. Supporta layout orizzontali, a griglia e sfalsati

Vantaggi di listView su recyclerView:

  1. Divisore facile da aggiungere.

  2. Può usare arrayAdapter integrato per semplici elenchi semplici

  3. Supporta intestazione e piè di pagina.

  4. Supporta OnItemClickListner.


4
Per quanto ho capito si può facilmente aggiungere un divisore per un recyclerView utilizzando recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL));dopo aver fatto una cosa del genererecyclerView = view.findViewById(R.id.feed);
nviens

1
@nviens Per la visualizzazione elenco puoi aggiungere un divisore, regolarne l'altezza e cambiarne il colore tutto in xml. Anche l'implementazione corrente per il divisore è ok, è stato un incubo aggiungere il divisore per recyclerview in precedenza, basta controllare questa risposta per vedere come l'implementazione precedente per il divisore era stackoverflow.com/a/27037230/6478047
Manohar Reddy

4

8 Differenze tra RecyclerView e ListView

Recyclerview vs ListView

1. ViewHolder Pattern

Il modello utilizzato per ridurre le chiamate ai metodi findViewById () .

In ListView, puoi facilmente creare un elenco senza usare ViewHolder. Ma non nel caso di RecyclerView.

2. Adattatore

Entrambi sono AdapterView, sì. Funziona in base alla classe dell'adattatore.

È facile creare ListView usando adattatori predefiniti come ArrayAdapter, CursorAdapter ma RecyclerView fornisce la classe RecyclerView.Adapter, per creare una nuova classe di adattatori personalizzati.

Non è possibile utilizzare ArrayAdapter o altri adattatori integrati con RecyclerView.

3. Disposizione degli articoli

Ho creato ListView verticale in codice semplice e meno. E se avessimo bisogno di creare un GridView?

RecyclerView utilizza LayoutManager per disporre i suoi oggetti. Esistono 3 classi di LayoutManager.

  • LinearLayoutManager : consente di creare un elenco di tipi lineari.
  • GridLayoutManager : utilizzato per creare la griglia.
  • StaggeredGridLayoutManager : utilizzato per creare griglie sfalsate.

animazioni

ListView manca di animazioni di base. Ma RecyclerView viene fornito con animazioni semplici.

Divisore

L' Android: divisorio e Android: dividerHeight attributi o setDivider (), setDividerHeight () vi aiuta a rendere personalizzato divisorio in ListView.

dal 25.1.0, è possibile utilizzare la classe DividerItemDecoration per creare un semplice divisore.

Fai clic su Eventi

RecyclerView manca di OnItemClickListener , sì, è molto triste. Ma danno maggiore controllo allo sviluppatore fornendo RecyclerView.OnItemTouchListener.

Metodi di notifica

È necessario chiamare i metodi di notifica * appropriati per eseguire animazioni corrette. RecylcerView ha molti metodi di notifica * rispetto a ListView.


3

Penso che la principale e più grande differenza che hanno sia quella di ListViewcercare la posizione dell'oggetto durante la sua creazione o di metterlo, d'altra parte RecyclerViewcerca il tipo di oggetto. se è stato creato un altro elemento con lo stesso tipo, RecyclerViewnon viene creato nuovamente. Chiede al primo adattatore e quindi chiede di riciclare pool, se il pool riciclato dice "sì, ho creato un tipo simile ad esso", quindi RecyclerViewnon tenta di creare lo stesso tipo. ListViewnon ha questo tipo di meccanismo di pooling.


2

A mio avviso, è RecyclerViewstato fatto per affrontare il problema con il modello di riciclo utilizzato nelle visualizzazioni di lista perché rendeva più difficile la vita degli sviluppatori. Tutti gli altri che potresti gestire più o meno. Per esempio io uso lo stesso adattatore per ListViewe GridViewnon importa in entrambe le viste le getView, getItemCount, getTypeCountviene utilizzato in modo che sia lo stesso. RecyclerViewnon è necessario se ListViewcon ListAdaptero GridViewcon adattatori di griglia funziona già per te. Se hai implementato correttamente il ViewHoldermodello nelle tue visualizzazioni elenco, non vedrai alcun grande miglioramento RecycleView.


2

Ho lavorato un po 'con RecyclerViewe preferisco ancora ListView.

  1. Certo, entrambi usano ViewHolders, quindi questo non è un vantaggio.

  2. A RecyclerViewè più difficile nella codifica.

  3. A RecyclerViewnon contiene un'intestazione e un piè di pagina, quindi è meno.

  4. A ListViewnon richiede di creare un ViewHolder. Nei casi in cui desideri avere un elenco con sezioni o sottotitoli, sarebbe una buona idea creare oggetti indipendenti (senza ViewHolder), è più facile e non richiede classi separate.


1
è possibile rendere lato intestazione e contenuto nell'adattatore recyclerview e sarà più flessibile di listview. solo difficile cambiare la tua lista viewview a recyclerview ma se riesci a fare questo, capirai cosa intendo. listview deprecato basta andare a provare a imparare
recyclerview

2
@erginduran, ho usato entrambi. ListView è ancora ampiamente utilizzato e non è deprecato. Inoltre, spreca meno memoria di RecyclerView. Se vuoi solo sostituire un ListView con RecyclerView, non sarà una buona idea.
CoolMind,

basta controllare perché questi ragazzi hanno sviluppato il recyclerview per? il miglioramento di listview, giusto? ci sono molte vecchie librerie e app in Google Play, quindi hai ragione, la visualizzazione elenco è ancora ampiamente utilizzata. Basta lasciare cose vecchie in passato. controlla i confronti -> link
erginduran,

@erginduran, grazie. Hai ragione, RecyclerView ha alcuni vantaggi. La mia risposta riguardava le normali attività in cui un ListView a volte è più semplice di un RecyclerView. Naturalmente, l'animazione e alcuni altri miglioramenti sono difficili o non possibili in un ListView.
CoolMind,

Ho aggiunto alcuni aspetti in quell'argomento, vedi stackoverflow.com/a/39721769/2914140 .
CoolMind,

1
  1. È possibile utilizzare un'interfaccia per fornire un listener di clic. Uso questa tecnica anche con ListViews.
  2. Nessun divisore: aggiungi semplicemente nella tua riga una vista con una larghezza di match_parent e un'altezza di 1dp e assegnagli un colore di sfondo.
  3. Basta usare un selettore StateList per lo sfondo delle righe.
  4. addHeaderView può essere evitato anche in ListViews: basta posizionare l'intestazione fuori dalla vista.

Quindi, se l'efficienza è la tua preoccupazione, allora sì, è una buona idea sostituire un ListView con un RecyclerView.


0

Risposta semplice: dovresti usare RecyclerView in una situazione in cui vuoi mostrare molti oggetti e il loro numero è dinamico. ListView deve essere utilizzato solo quando il numero di elementi è sempre lo stesso ed è limitato alle dimensioni dello schermo.

Lo trovi più difficile perché stai pensando solo pensando alla libreria Android.

Oggi esistono molte opzioni che ti aiutano a costruire i tuoi adattatori, semplificando la creazione di elenchi e griglie di elementi dinamici che puoi selezionare, riordinare, utilizzare animazioni, divisori, aggiungere piè di pagina, intestazioni, ecc. Ecc.

Non aver paura e prova a RecyclerView, puoi iniziare ad amarlo facendo un elenco di 100 elementi scaricati dal web (come le notizie di Facebook) in ListView e RecyclerView, vedrai la differenza nella UX (utente esperienza) quando provi a scorrere, probabilmente l'app di test si fermerà prima ancora di poterlo fare.

Ti consiglio di controllare queste due librerie per rendere facili gli adattatori:

FastAdapter di mikepenz

FlexibleAdapter di davideas


1
Penso che le tue dichiarazioni sulla differenza di prestazioni tra i due siano esagerate. Uso ListView in un'app di produzione dal 2012, visualizzando fino a 3000 elementi con ~ 10 visualizzazioni diverse in ogni riga, senza alcun problema dal punto di vista delle prestazioni anche sui vecchi dispositivi Android 2.3.
Magnus W

0

RecyclerView info

È RecyclerViewstato introdotto con Android 5.0 (Lollipop). è incluso nella libreria di supporto . Pertanto, è compatibile con Android API Level 7.

Allo stesso modo ListView, l' RecyclerView’sidea principale è quella di fornire funzionalità di elenco in modo amichevole per le prestazioni. La parte "Recycler" del nome di questa vista non è lì per coincidenza. L' RecyclerViewpuò effettivamente riciclare gli elementi con cui è attualmente di lavoro. Il processo di riciclaggio viene eseguito grazie a un modello chiamato View Holder .

Pro e contro di RecyclerView

Professionisti:

  • animazioni integrate per l'aggiunta, l'aggiornamento e la rimozione di elementi
  • applica il riciclo delle viste utilizzando il modello ViewHolder
  • supporta sia le griglie che gli elenchi
  • supporta lo scorrimento verticale e orizzontale
  • può essere utilizzato insieme a DiffUtil

Contro:

  • aggiunge complessità
  • no OnItemClickListener

Informazioni ListView

The ListViewè in circolazione sin dall'inizio di Android. Era disponibile anche in API Level 1e ha lo stesso scopo delRecyclerView .

L'uso di ListView è in realtà molto semplice. Sotto questo aspetto, non è come il suo successore. La curva di apprendimento è più liscia di quella di RecyclerView. Pertanto, è più facile da capire. Non dobbiamo occuparci di cose come LayoutManager, ItemAnimator o DiffUtil.

Pro e contro di ListView

Professionisti:

  • utilizzo semplice
  • adattatori predefiniti
  • disponibile OnItemClickListener
  • è il fondamento del ExpandableListView

Contro:

  • non abbraccia l'uso del modello ViewHolder

0

Esistono molte differenze tra ListView e RecyclerView, ma è necessario tenere presente quanto segue in particolare:

  • Il modello ViewHolder è completamente opzionale in ListView, ma è inserito in RecyclerView.
  • ListView supporta solo lo scorrimento verticale, ma RecyclerView non si limita agli elenchi a scorrimento verticale.
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.