Condividi tramite


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 oggetto RecyclerView. L'adattatore segnala anche gli eventi di clic sugli elementi.

  • LayoutManager – Misura e posiziona le visualizzazioni degli elementi all'interno di un RecyclerView 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 RecyclerViewclassi , LayoutManagere Adapter viene illustrata nel diagramma seguente:

Diagram of RecyclerView containing LayoutManager, using Adapter to access Data Set

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 di RecyclerView. L'adattatore sa come associare ogni posizione della visualizzazione elemento in RecyclerView 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 di RecyclerView. È 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:

Diagram illustrating the six steps of view recycling

  1. Quando una visualizzazione scorre fuori dalla vista e non viene più visualizzata, diventa una visualizzazione rottami.

  2. 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.

  3. 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.

  4. 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.

  5. La visualizzazione riciclata viene aggiunta all'elenco di elementi in RecyclerView cui si sta per passare sullo schermo.

  6. 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:

  1. Sottoclasse RecyclerView.ViewHolder.
  2. Implementare un costruttore che cerca e archivia i riferimenti alla visualizzazione.
  3. 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.ViewHolderclasse 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:

Diagram illustrating Adapter connecting Data Source to ViewHolders

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.