Dovremmo usare RecyclerView per sostituire ListView?


232

Documenti Android dicono:

Il widget RecyclerView è una versione più avanzata e flessibile di ListView. Questo widget è un contenitore per la visualizzazione di set di dati di grandi dimensioni che possono essere fatti scorrere in modo molto efficiente mantenendo un numero limitato di visualizzazioni. Utilizzare il widget RecyclerView quando si hanno raccolte di dati i cui elementi cambiano in fase di esecuzione in base all'azione dell'utente o agli eventi di rete

In realtà ListViewpuò fare tutto quanto sopra se l'efficienza non ha importanza e abbiamo riscontrato molti problemi quando utilizziamo RecyclerViewper sostituire ListView:

  1. OnItemClickListener () non esiste per la selezione degli elementi dell'elenco - soluzione

  2. Nessun divisore tra gli elementi dell'elenco - soluzione

  3. Nessun selettore di sovrapposizione incorporato, nessun feedback visivo quando si fa clic sull'elemento dell'elenco - soluzione

  4. No addHeaderView per intestazione elenco - soluzione

Forse più problemi ...

Quindi, quando usiamo RecyclerViewper sostituire ListView, dobbiamo fare molta più codifica per ottenere lo stesso effetto di ListView.

DOMANDA:

  • Vale la pena sostituirlo ListViewcon RecyclerViewtotalmente?
  • se poi nel qual caso dovremmo meglio usare RecyclerViewinvece ListView, e viceversa?

9
la tua discussione è solo il primo numero e non è la mia domanda
Xcihnegn

3
Basta menzionare che è necessario utilizzare un recyclerview se si è interessati a utilizzare una barra delle azioni compressa. medium.com/android-bites/...
Francas

dovresti usare recyclerview perché offre più controllo di listview. È un po 'complesso ma ci arrivi, quindi la tua vita sarà super facile ogni volta che avrai a che fare con un elenco di cose.
Sadashiv,

3
meglio è nemico del bene.
Oldergod,

Risposte:


118

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

RecyclerView è potente quando devi personalizzare la tua lista o vuoi animazioni migliori. Quei metodi convenienti in ListView hanno causato molti problemi alle persone, motivo per cui RecyclerView fornisce loro una soluzione più flessibile.

La principale modifica che è necessario apportare per la migrazione è nell'adattatore. Se vuoi continuare a chiamare notifyDataSetChanged, perdi la maggior parte dei vantaggi di animazione e associazione. Ma se puoi cambiare l'adattatore per inviare eventi di notifica dettagliati (aggiunti / rimossi / spostati / aggiornati), otterrai animazioni e prestazioni molto migliori. Questi eventi consentono a RecyclerView di scegliere le animazioni corrette e anche di evitare onBindchiamate non necessarie . Otterrai un enorme vantaggio se le visualizzazioni degli articoli sono complesse. Inoltre, andando avanti, ci saranno più componenti attorno a RecyclerView.


2
Se potessi darti 100 voti lo farei. Il notifyDataSetChanged()metodo faceva sì che il mio RecyclerViewcontinuasse a chiedere sempre nuove novità ViewHolders, mettendo a nudo i vantaggi del ViewHoldermodello. Cercando la soluzione ho trovato il tuo commento che risponde al mio problema praticamente di passaggio: D grazie!
Aspirante Dev

Non sono d'accordo "Otterrai un enorme vantaggio se le visualizzazioni degli articoli sono complesse", ho recyclerView in cui l'adattatore ne ha 3 se altrimenti, Recyclerview ha prestazioni scarse nel mio caso. Ho dovuto disabilitare il riciclo usando isRecyclable(false);e il risultato finale è RecyclerView molto lento. Non posso nemmeno cambiarlo, ci vorrà molto tempo per tornare alla lista :(
kashyap jimuliya

4
le persone usano il camper con molti più tipi di quelli senza problemi e buone prestazioni. C'è qualcos'altro che non va nel tuo codice. Dovresti usare systrace / traceview e vedere cosa sta succedendo.
yigit

1
@kashyapjimuliya come menzionato yigit , 3 if-else non dovrebbe causarlo . In primo luogo, non hai menzionato dove hai messo questi if-else; in secondo luogo, disabilitare il riciclaggio dovrebbe renderlo più lento, non più veloce. Perché? Perché gonfiare una vista e fare findViewById()è molto costoso che farlo nel ViewHoldermodo giusto.
Sufian,

24

Secondo me, se ListView soddisfa tutte le esigenze attuali della tua app e soddisfa tutti i casi d'uso, non è necessario sostituirlo con un RecyclerView.

RecyclerView offre enorme potenza ai suoi sviluppatori al costo di aumentare la complessità per gli sviluppatori. Ci sono alcune cose che potrebbero essere fatte facilmente in un ListView che ora può richiedere molti sforzi inutili.

Ma sì, ci sono molte cose che un ListView non può mai fare, come la straordinaria funzione LayoutManager che può consentire di modificare dinamicamente il layout in orizzontale, verticale, griglia o griglia sfalsata senza soluzione di continuità.

Ho scritto una risposta dettagliata su questo argomento qui .


3
Certo, RecyclerView aumenta la complessità, ma almeno implementa il modello ViewHolder per te.
IgorGanapolsky,

@IgorGanapolsky +1 per l'implementazione del modello ViewHolder.
Sreekanth Karumanaghat,

puoi scrivere il tuo schema di visualizzazione proprio bene con un ListView
dan

9

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 Utilizzare semplicemente un selettore StateList per lo sfondo della riga.
4 addHeaderView può essere evitato anche in ListViews: basta posizionare l'intestazione fuori dalla vista.

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


19
Queste non sono le mie domande, ho avuto un link per ogni soluzione del problema
Xcihnegn

6

Fino a poco tempo fa utilizzavo ListView per elenchi molto semplici. Ad esempio, se voglio visualizzare un semplice elenco di opzioni di testo ...

Ho basato questa decisione su "fattori umani", secondo cui la creazione di un semplice ListView con meno codice è migliore se le prestazioni sono irrilevanti. Penso spesso a un professore al college che amava dire: "La mia insegnante, la grande Niclaus Wirth, l'inventore di Pascal, diceva che se un programma ha più di 50 righe di codice è sicuramente sbagliato ..."

Ma ciò che mi ha convinto a smettere di usare ListView è che recentemente è stato spostato nella categoria "Legacy" nello strumento di progettazione di Android Studio insieme a RelativeLayout.

https://developer.android.com/reference/android/widget/ListView

Penso che questa sia una forma "soft" di "deprecazione". Sarebbe troppo distruttivo se fosse effettivamente deprecato e tutti gli sviluppatori coscienziosi spostassero il loro codice su RecyclerView.

Inoltre, l'introduzione di ListView avverte in alto che RecyclerView è un'opzione migliore: "Per un approccio più moderno, flessibile e performante alla visualizzazione degli elenchi, utilizzare RecyclerView".
https://developer.android.com/reference/android/widget/ListView

Inoltre, la guida a ListView parla ancora dei caricatori di cursori, ma poi getSupportCursorLoader () stesso è stato appena deprecato in API 28.
https://developer.android.com/guide/topics/ui/layout/listview

Miglioramenti recenti ad Android Studio:

File -> Nuovo -> Frammento -> Frammento (Elenco)

Questo ci dà un RecylerView perfettamente funzionante popolato con testo di base. Ciò elimina il mio ultimo vero motivo per l'utilizzo di ListView perché ora è altrettanto semplice impostare un RecylerView di base.

In sintesi, non intendo usare ListView per i nuovi sviluppi perché l'etichettatura ha "legacy" a un passo dal deprezzamento.


3

L'unico caso in cui è ancora corretto utilizzare ListView è quando l'elenco non è dinamico o influenzato da eventi di rete. Ad esempio: navigazione.

Per qualsiasi altro uso, RecyclerView eclissa ListView. Poiché RecyclerView si preoccupa solo del riciclo, sarà più facile eseguire operazioni visive strettamente accoppiate in ListView, come la modifica della posizione / riarrangiamento, l'animazione (in effetti viene fornita con RecyclerView.ItemAnimator), layout personalizzati (lo stock ha StaggeredGrid in aggiunta a il vecchio elenco o lo stile della griglia ma c'è anche questa libreria che lo estende ancora di più).

Inoltre, se vuoi usare CardView, credo che sia l'unico modo per andare (qualche buona lettura quando usare la carta o la lista).


Ti riferisci all'acquisizione di un elenco di dati dai server, quindi memorizzato nel sqlite sul telefono per essere utilizzato in una visualizzazione elenco (diciamo dei tuoi follower) è meglio usare una vista riciclatore piuttosto che una vista elenco con un titolare della vista ?
Lion789

Sì. Ma per essere precisi, non vedo più alcun ruolo per ListView tranne la navigazione e questo perché penso che sia eccessivo usare RecyclerView lì.
inmyth

2

Un'ottima alternativa sta usando BaseAdapter. Supporta l'uso del modello Viewholder e il mio contiene oltre 100 righe con bitmap e pulsanti ed è molto fluido.

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.