RecyclerView parti e funzionalità
RecyclerView
gestisce alcune attività internamente (ad esempio lo scorrimento e il riciclo delle visualizzazioni), ma è essenzialmente un gestore che coordina le classi helper per visualizzare una raccolta. RecyclerView
delega le attività alle classi helper seguenti:
Adapter
: gonfia i layout degli elementi (crea un'istanza del contenuto di un file di layout) e associa i dati alle visualizzazioni visualizzate all'interno di un oggettoRecyclerView
. L'adattatore segnala anche gli eventi di clic sugli elementi.LayoutManager
– Misura e posiziona le visualizzazioni degli elementi all'interno di unRecyclerView
e gestisce i criteri per il riciclo delle visualizzazioni.ViewHolder
: cerca e archivia i riferimenti alle visualizzazioni. Il supporto per la visualizzazione consente anche di rilevare i clic della visualizzazione elementi.ItemDecoration
: consente a un'app di aggiungere offset speciali di disegno e layout a visualizzazioni specifiche per i divisori di disegno tra elementi, evidenziazioni e limiti di raggruppamento degli oggetti visivi.ItemAnimator
: definisce le animazioni che vengono eseguite durante le azioni dell'elemento o quando vengono apportate modifiche all'adattatore.
La relazione tra le RecyclerView
classi , LayoutManager
e Adapter
viene illustrata nel diagramma seguente:
Come illustrato in questa figura, può LayoutManager
essere considerato come intermediario tra Adapter
e RecyclerView
. Esegue LayoutManager
chiamate ai Adapter
metodi per conto dell'oggetto RecyclerView
. Ad esempio, LayoutManager
chiama un Adapter
metodo quando è il momento di creare una nuova visualizzazione per una determinata posizione dell'elemento nell'oggetto RecyclerView
. L'oggetto Adapter
gonfia il layout per tale elemento e crea un'istanza ViewHolder
(non visualizzata) per memorizzare nella cache i riferimenti alle visualizzazioni in tale posizione. Quando chiama l'oggetto LayoutManager
Adapter
per associare un particolare elemento al set di dati, Adapter
individua i dati per tale elemento, li recupera dal set di dati e li copia nella visualizzazione elemento associata.
Quando si usa RecyclerView
nell'app, è necessario creare tipi derivati delle classi seguenti:
RecyclerView.Adapter
: fornisce un binding dal set di dati dell'app (specifico per l'app) alle visualizzazioni degli elementi visualizzate all'interno diRecyclerView
. L'adattatore sa come associare ogni posizione della visualizzazione elemento inRecyclerView
a una posizione specifica nell'origine dati. Inoltre, l'adattatore gestisce il layout del contenuto all'interno di ogni singola visualizzazione elemento e crea il supporto di visualizzazione per ogni visualizzazione. L'adattatore segnala anche gli eventi di clic sugli elementi rilevati dalla visualizzazione elementi.RecyclerView.ViewHolder
: memorizza nella cache i riferimenti alle visualizzazioni nel file di layout degli elementi in modo che le ricerche di risorse non vengano ripetute inutilmente. Il supporto di visualizzazione dispone anche gli eventi di clic sugli elementi da inoltrare all'adattatore quando un utente tocca la visualizzazione elementi associata del titolare di visualizzazione.RecyclerView.LayoutManager
: posiziona gli elementi all'interno diRecyclerView
. È possibile usare uno dei diversi gestori di layout predefiniti oppure implementare il proprio gestore di layout personalizzato.RecyclerView
delega i criteri di layout al gestore layout, in modo da poter collegare un gestore di layout diverso senza dover apportare modifiche significative all'app.
Facoltativamente, puoi anche estendere le classi seguenti per modificare l'aspetto dell'app RecyclerView
:
RecyclerView.ItemDecoration
RecyclerView.ItemAnimator
Se non si estende ItemDecoration
e ItemAnimator
, RecyclerView
usa le implementazioni predefinite. Questa guida non spiega come creare classi e ItemAnimator
personalizzateItemDecoration
. Per altre informazioni su queste classi, vedere RecyclerView.ItemDecoration e RecyclerView.ItemAnimator.
Funzionamento del riciclo delle visualizzazioni
RecyclerView
non alloca una visualizzazione elemento per ogni elemento nell'origine dati. Alloca invece solo il numero di visualizzazioni degli elementi che si adattano allo schermo e riutilizza tali layout di elemento durante lo scorrimento dell'utente. Quando la vista scorre per la prima volta fuori dalla vista, passa attraverso il processo di riciclo illustrato nella figura seguente:
Quando una visualizzazione scorre fuori dalla vista e non viene più visualizzata, diventa una visualizzazione rottami.
La visualizzazione degli scarti viene posizionata in un pool e diventa una visualizzazione di riciclo. Questo pool è una cache di visualizzazioni che visualizzano lo stesso tipo di dati.
Quando un nuovo elemento deve essere visualizzato, una visualizzazione viene ricavata dal pool di riciclo per il riutilizzo. Poiché questa vista deve essere ri-associata dall'adattatore prima di essere visualizzata, viene chiamata visualizzazione dirty.
La visualizzazione dirty viene riciclata: l'adattatore individua i dati per l'elemento successivo da visualizzare e copia questi dati nelle visualizzazioni per questo elemento. I riferimenti per queste visualizzazioni vengono recuperati dal supporto di visualizzazione associato alla visualizzazione riciclata.
La visualizzazione riciclata viene aggiunta all'elenco di elementi in
RecyclerView
cui si sta per passare sullo schermo.La visualizzazione riciclata passa sullo schermo mentre l'utente scorre
RecyclerView
fino all'elemento successivo nell'elenco. Nel frattempo, un'altra vista scorre fuori dalla vista e viene riciclata in base ai passaggi precedenti.
Oltre al riutilizzo della visualizzazione elementi, RecyclerView
usa anche un'altra ottimizzazione dell'efficienza: i segnaposto di visualizzazione. Un supporto di visualizzazione è una classe semplice che memorizza nella cache i riferimenti alla visualizzazione. Ogni volta che l'adattatore gonfia un file di layout degli elementi, crea anche un supporto di visualizzazione corrispondente. Il supporto di visualizzazione usa FindViewById
per ottenere riferimenti alle visualizzazioni all'interno del file di layout degli elementi gonfiato. Questi riferimenti vengono usati per caricare nuovi dati nelle visualizzazioni ogni volta che il layout viene riciclato per mostrare nuovi dati.
Gestione layout
Il gestore layout è responsabile del posizionamento degli elementi nella RecyclerView
visualizzazione, determina il tipo di presentazione (un elenco o una griglia), l'orientamento (se gli elementi vengono visualizzati verticalmente o orizzontalmente) e quali elementi di direzione devono essere visualizzati (in ordine normale o in ordine inverso). Gestione layout è anche responsabile del calcolo delle dimensioni e della posizione di ogni elemento nella visualizzazione RecycleView .
Gestione layout ha uno scopo aggiuntivo: determina i criteri per quando riciclare le visualizzazioni degli elementi che non sono più visibili all'utente. Poiché il gestore layout è a conoscenza delle visualizzazioni visibili (e che non lo sono), è nella posizione migliore decidere quando una vista può essere riciclata. Per riciclare una visualizzazione, gestione layout effettua in genere chiamate all'adattatore per sostituire il contenuto di una visualizzazione riciclata con dati diversi, come descritto in precedenza in How View Recycling Works.
È possibile estendere RecyclerView.LayoutManager
la creazione di un gestore layout personalizzato oppure usare un gestore di layout predefinito. RecyclerView
fornisce i seguenti gestori di layout predefiniti:
LinearLayoutManager
: dispone gli elementi in una colonna che possono essere scorrevoli verticalmente o in una riga che può essere scorrevole orizzontalmente.GridLayoutManager
: visualizza gli elementi in una griglia.StaggeredGridLayoutManager
– Visualizza gli elementi in una griglia sfalsata, in cui alcuni elementi hanno altezze e larghezze diverse.
Per specificare gestione layout, creare un'istanza del gestore layout scelto e passarla al SetLayoutManager
metodo . Si noti che è necessario specificare gestione layout. RecyclerView
Per impostazione predefinita, non è possibile selezionare un gestore layout predefinito.
Per altre informazioni sulla gestione layout, vedere le informazioni di riferimento sulla classe RecyclerView.LayoutManager.
Supporto visualizzazione
Il supporto di visualizzazione è una classe definita per i riferimenti alla visualizzazione di memorizzazione nella cache. L'adattatore usa questi riferimenti di visualizzazione per associare ogni visualizzazione al relativo contenuto. Ogni elemento in ha un'istanza associata del titolare della RecyclerView
visualizzazione che memorizza nella cache i riferimenti alla visualizzazione per tale elemento. Per creare un supporto di visualizzazione, seguire questa procedura per definire una classe per contenere il set esatto di visualizzazioni per elemento:
- Sottoclasse
RecyclerView.ViewHolder
. - Implementare un costruttore che cerca e archivia i riferimenti alla visualizzazione.
- Implementare le proprietà che l'adapter può usare per accedere a questi riferimenti.
Un esempio dettagliato di un'implementazione ViewHolder
viene presentato in Un esempio di Basic RecyclerView.
Per altre informazioni su , vedere le informazioni di riferimento sulla RecyclerView.ViewHolder
classe RecyclerView.ViewHolder.
The Adapter
La maggior parte del codice di integrazione viene RecyclerView
eseguita nell'adattatore. RecyclerView
richiede di fornire un adattatore derivato da RecyclerView.Adapter
per accedere all'origine dati e popolare ogni elemento con contenuto dall'origine dati.
Poiché l'origine dati è specifica dell'app, è necessario implementare la funzionalità dell'adattatore che riconosce come accedere ai dati. L'adattatore estrae le informazioni dall'origine dati e le carica in ogni elemento della RecyclerView
raccolta.
Il disegno seguente illustra come l'adattatore esegue il mapping del contenuto in un'origine dati tramite i titolari di visualizzazione a singole visualizzazioni all'interno di ogni elemento di riga in RecyclerView
:
L'adattatore carica ogni RecyclerView
riga con dati per un elemento di riga specifico. Per la posizione di riga P, ad esempio, l'adattatore individua i dati associati nella posizione P all'interno dell'origine dati e copia questi dati nell'elemento di riga nella posizione P dell'insieme RecyclerView
.
Nel disegno precedente, ad esempio, l'adattatore utilizza il supporto di visualizzazione per cercare i riferimenti per ImageView
e TextView
in tale posizione, in modo che non sia necessario chiamare FindViewById
ripetutamente tali visualizzazioni mentre l'utente scorre la raccolta e riutilizza le visualizzazioni.
Quando si implementa un adattatore, è necessario eseguire l'override dei metodi seguenti RecyclerView.Adapter
:
OnCreateViewHolder
: crea un'istanza del file di layout dell'elemento e del supporto di visualizzazione.OnBindViewHolder
: carica i dati nella posizione specificata nelle visualizzazioni i cui riferimenti vengono archiviati nel supporto di visualizzazione specificato.ItemCount
: restituisce il numero di elementi nell'origine dati.
Gestione layout chiama questi metodi mentre posiziona gli elementi all'interno di RecyclerView
.
Notifica a RecyclerView delle modifiche ai dati
RecyclerView
non aggiorna automaticamente la visualizzazione quando cambia il contenuto dell'origine dati; l'adattatore deve inviare una notifica RecyclerView
quando si verifica una modifica nel set di dati. Il set di dati può cambiare in molti modi; Ad esempio, il contenuto all'interno di un elemento può modificare o la struttura complessiva dei dati può essere modificata.
RecyclerView.Adapter
fornisce diversi metodi che è possibile chiamare in modo da RecyclerView
rispondere alle modifiche ai dati nel modo più efficiente:
NotifyItemChanged
– Segnala che l'elemento in corrispondenza della posizione specificata è cambiato.NotifyItemRangeChanged
– Segnala che gli elementi nell'intervallo specificato di posizioni sono stati modificati.NotifyItemInserted
: segnala che l'elemento nella posizione specificata è stato appena inserito.NotifyItemRangeInserted
– Segnala che gli elementi nell'intervallo specificato di posizioni sono stati appena inseriti.NotifyItemRemoved
– Segnala che l'elemento nella posizione specificata è stato rimosso.NotifyItemRangeRemoved
– Segnala che gli elementi nell'intervallo specificato di posizioni sono stati rimossi.NotifyDataSetChanged
: segnala che il set di dati è stato modificato (forza un aggiornamento completo).
Se si conosce esattamente il modo in cui il set di dati è stato modificato, è possibile chiamare i metodi appropriati sopra per eseguire l'aggiornamento RecyclerView
nel modo più efficiente. Se non si conosce esattamente il modo in cui il set di dati è stato modificato, è possibile chiamare NotifyDataSetChanged
, che è molto meno efficiente perché RecyclerView
deve aggiornare tutte le visualizzazioni visibili all'utente. Per altre informazioni su questi metodi, vedere RecyclerView.Adapter.
Nell'argomento successivo, un esempio di Basic RecyclerView, viene implementata un'app di esempio per illustrare esempi di codice reali delle parti e delle funzionalità descritte in precedenza.