Questo codelab fa parte del corso Android Kotlin Fundamentals. Per ottenere il massimo valore da questo corso, ti consigliamo di seguire le codelab in sequenza. Tutti i codelab del corso sono elencati nella pagina di destinazione dei codelab Android Kotlin Fundamentals.
Introduzione
Nel codelab precedente, hai aggiornato l'app TrackMySleepQuality per visualizzare i dati sulla qualità del sonno in un RecyclerView
. Le tecniche che hai imparato quando hai creato il primo RecyclerView
sono sufficienti per la maggior parte dei RecyclerViews
che mostrano elenchi semplici non troppo grandi. Tuttavia, esistono diverse tecniche che rendono RecyclerView
più efficiente per le liste di grandi dimensioni e che semplificano la manutenzione e l'estensione del codice per liste e griglie complesse.
In questo codelab, utilizzerai l'app di monitoraggio del sonno del codelab precedente. Impari un modo più efficace per aggiornare l'elenco dei dati sul sonno e come utilizzare il data binding con RecyclerView
. Se non hai l'app del codelab precedente, puoi scaricare il codice iniziale per questo codelab.
Cosa devi già sapere
- Creazione di un'interfaccia utente di base utilizzando un'attività, frammenti e visualizzazioni.
- Spostarsi tra i fragment e utilizzare
safeArgs
per passare i dati tra i fragment. - Visualizza modelli, fabbriche di modelli, trasformazioni e
LiveData
e i relativi osservatori. - Come creare un database
Room
, creare un DAO e definire le entità. - Come utilizzare le coroutine per il database e altre attività di lunga durata.
- Come implementare un
RecyclerView
di base con un layoutAdapter
,ViewHolder
e degli elementi.
Obiettivi didattici
- Come utilizzare
DiffUtil
per aggiornare in modo efficiente un elenco visualizzato daRecyclerView
. - Come utilizzare il data binding con
RecyclerView
. - Come utilizzare gli adattatori di binding per trasformare i dati.
In questo lab proverai a:
- Sviluppa l'app TrackMySleepQuality del codelab precedente di questa serie.
- Aggiorna
SleepNightAdapter
per aggiornare in modo efficiente l'elenco utilizzandoDiffUtil
. - Implementa il data binding per
RecyclerView
utilizzando gli adattatori di binding per trasformare i dati.
L'app per il monitoraggio del sonno ha due schermate, rappresentate da frammenti, come mostrato nella figura seguente.
La prima schermata, mostrata a sinistra, ha pulsanti per avviare e interrompere il monitoraggio. La schermata mostra alcuni dati sul sonno dell'utente. Il pulsante Cancella elimina definitivamente tutti i dati raccolti dall'app per l'utente. La seconda schermata, mostrata a destra, serve per selezionare una valutazione della qualità del sonno.
Questa app è progettata per utilizzare un controller UI, ViewModel
e LiveData
, e un database Room
per archiviare i dati sul sonno.
I dati sul sonno vengono visualizzati in un RecyclerView
. In questo codelab, creerai la parte DiffUtil
e il data binding per RecyclerView
. Al termine di questo codelab, la tua app avrà lo stesso aspetto, ma sarà più efficiente e più facile da scalare e gestire.
Puoi continuare a utilizzare l'app SleepTracker del codelab precedente oppure scaricare l'app RecyclerViewDiffUtilDataBinding-Starter da GitHub.
- Se necessario, scarica l'app RecyclerViewDiffUtilDataBinding-Starter da GitHub e apri il progetto in Android Studio.
- Esegui l'app.
- Apri il file
SleepNightAdapter.kt
. - Esamina il codice per acquisire familiarità con la struttura dell'app. Consulta il diagramma di seguito per un riepilogo dell'utilizzo di
RecyclerView
con il pattern dell'adattatore per mostrare i dati sul sonno all'utente.
- A partire dall'input utente, l'app crea un elenco di oggetti
SleepNight
. Ogni oggettoSleepNight
rappresenta una singola notte di sonno, la sua durata e la sua qualità. SleepNightAdapter
adatta l'elenco degli oggettiSleepNight
in modo cheRecyclerView
possa utilizzarli e visualizzarli.- L'adattatore
SleepNightAdapter
produceViewHolders
che contengono le visualizzazioni, i dati e i metadati per la visualizzazione riciclata per mostrare i dati. RecyclerView
utilizzaSleepNightAdapter
per determinare quanti elementi visualizzare (getItemCount()
).RecyclerView
utilizzaonCreateViewHolder()
eonBindViewHolder()
per ottenere i segnaposto della visualizzazione associati ai dati da visualizzare.
Il metodo notifyDataSetChanged() è inefficiente
Per comunicare a RecyclerView
che un elemento dell'elenco è stato modificato e deve essere aggiornato, il codice corrente chiama notifyDataSetChanged()
in SleepNightAdapter
, come mostrato di seguito.
var data = listOf<SleepNight>()
set(value) {
field = value
notifyDataSetChanged()
}
Tuttavia, notifyDataSetChanged()
comunica a RecyclerView
che l'intero elenco è potenzialmente non valido. Di conseguenza, RecyclerView
esegue il rebinding e il ridisegno di ogni elemento dell'elenco, inclusi quelli non visibili sullo schermo. Si tratta di un sacco di lavoro inutile. Per elenchi grandi o complessi, questa procedura potrebbe richiedere un tempo sufficiente a far sfarfallare o balbettare la visualizzazione mentre l'utente scorre l'elenco.
Per risolvere il problema, puoi comunicare a RecyclerView
esattamente cosa è cambiato. RecyclerView
può quindi aggiornare solo le visualizzazioni che sono cambiate sullo schermo.
RecyclerView
dispone di un'API avanzata per l'aggiornamento di un singolo elemento. Puoi utilizzare notifyItemChanged()
per comunicare a RecyclerView
che un elemento è stato modificato e puoi utilizzare funzioni simili per gli elementi aggiunti, rimossi o spostati. Potresti fare tutto manualmente, ma questa attività non sarebbe banale e potrebbe richiedere un bel po' di codice.
Fortunatamente, esiste un modo migliore.
DiffUtil è efficiente e fa il lavoro più impegnativo al posto tuo
RecyclerView
ha una classe chiamata DiffUtil
che serve per calcolare le differenze tra due elenchi. DiffUtil
prende un elenco precedente e uno nuovo e determina le differenze. Trova gli elementi che sono stati aggiunti, rimossi o modificati. Poi utilizza un algoritmo chiamato Eugene W. Myers's difference algorithm per calcolare il numero minimo di modifiche da apportare all'elenco precedente per produrre il nuovo elenco.
Una volta che DiffUtil
ha capito cosa è cambiato, RecyclerView
può utilizzare queste informazioni per aggiornare solo gli elementi che sono stati modificati, aggiunti, rimossi o spostati, il che è molto più efficiente rispetto al rifacimento dell'intero elenco.
In questa attività, esegui l'upgrade di SleepNightAdapter
per utilizzare DiffUtil
per ottimizzare RecyclerView
per le modifiche ai dati.
Passaggio 1: implementa SleepNightDiffCallback
Per utilizzare la funzionalità della classe DiffUtil
, estendi DiffUtil.ItemCallback
.
- Apri
SleepNightAdapter.kt
. - Sotto la definizione completa della classe per
SleepNightAdapter
, crea una nuova classe di primo livello chiamataSleepNightDiffCallback
che estendeDiffUtil.ItemCallback
. TrasmettiSleepNight
come parametro generico.
class SleepNightDiffCallback : DiffUtil.ItemCallback<SleepNight>() {
}
- Posiziona il cursore sul nome del corso
SleepNightDiffCallback
. - Premi
Alt+Enter
(Option+Enter
su Mac) e seleziona Implementa membri. - Nella finestra di dialogo che si apre, fai clic con il tasto sinistro del mouse tenendo premuto il tasto Maiusc per selezionare i metodi
areItemsTheSame()
eareContentsTheSame()
, quindi fai clic su Ok.
Vengono generati stub all'interno diSleepNightDiffCallback
per i due metodi, come mostrato di seguito.DiffUtil
utilizza questi due metodi per capire come sono cambiati l'elenco e gli elementi.
override fun areItemsTheSame(oldItem: SleepNight, newItem: SleepNight): Boolean {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun areContentsTheSame(oldItem: SleepNight, newItem: SleepNight): Boolean {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
- All'interno di
areItemsTheSame()
, sostituisciTODO
con il codice che verifica se i due elementiSleepNight
passati,oldItem
enewItem
, sono uguali. Se gli articoli hanno lo stessonightId
, sono lo stesso articolo, quindi restituiscitrue
. In caso contrario, restituiscifalse
.DiffUtil
utilizza questo test per rilevare se un elemento è stato aggiunto, rimosso o spostato.
override fun areItemsTheSame(oldItem: SleepNight, newItem: SleepNight): Boolean {
return oldItem.nightId == newItem.nightId
}
- All'interno di
areContentsTheSame()
, controlla seoldItem
enewItem
contengono gli stessi dati, ovvero se sono uguali. Questo controllo di uguaglianza controllerà tutti i campi, perchéSleepNight
è una classe di dati. Le classiData
definiscono automaticamenteequals
e alcuni altri metodi. Se esistono differenze traoldItem
enewItem
, questo codice indica aDiffUtil
che l'articolo è stato aggiornato.
override fun areContentsTheSame(oldItem: SleepNight, newItem: SleepNight): Boolean {
return oldItem == newItem
}
È un pattern comune utilizzare un RecyclerView
per visualizzare un elenco che cambia. RecyclerView
fornisce una classe adattatore, ListAdapter
, che ti aiuta a creare un adattatore RecyclerView
supportato da un elenco.
ListAdapter
tiene traccia dell'elenco per te e invia una notifica all'adattatore quando l'elenco viene aggiornato.
Passaggio 1: modifica l'adattatore per estendere ListAdapter
- Nel file
SleepNightAdapter.kt
, modifica la firma della classe diSleepNightAdapter
per estendereListAdapter
. - Se richiesto, importa
androidx.recyclerview.widget.ListAdapter
. - Aggiungi
SleepNight
come primo argomento aListAdapter
, prima diSleepNightAdapter.ViewHolder
. - Aggiungi
SleepNightDiffCallback()
come parametro al costruttore.ListAdapter
utilizzerà questo valore per capire cosa è cambiato nell'elenco. La firma della classeSleepNightAdapter
completata dovrebbe avere l'aspetto mostrato di seguito.
class SleepNightAdapter : ListAdapter<SleepNight, SleepNightAdapter.ViewHolder>(SleepNightDiffCallback()) {
- All'interno della classe
SleepNightAdapter
, elimina il campodata
, incluso il setter. Non ti serve più perchéListAdapter
tiene traccia dell'elenco per te. - Elimina l'override di
getItemCount()
, perchéListAdapter
implementa questo metodo per te. - Per eliminare l'errore in
onBindViewHolder()
, modifica la variabileitem
. Anziché utilizzaredata
per ottenere unitem
, chiama il metodogetItem(position)
fornito daListAdapter
.
val item = getItem(position)
Passaggio 2: utilizza submitList() per mantenere aggiornato l'elenco
Il codice deve comunicare a ListAdapter
quando è disponibile un elenco modificato. ListAdapter
fornisce un metodo chiamato submitList()
per comunicare a ListAdapter
che è disponibile una nuova versione dell'elenco. Quando viene chiamato questo metodo, ListAdapter
confronta il nuovo elenco con quello precedente e rileva gli elementi aggiunti, rimossi, spostati o modificati. A questo punto, ListAdapter
aggiorna gli elementi mostrati da RecyclerView
.
- Apri
SleepTrackerFragment.kt
. - In
onCreateView()
, nell'osservatore susleepTrackerViewModel
, trova l'errore in cui viene fatto riferimento alla variabiledata
che hai eliminato. - Sostituisci
adapter.data = it
con una chiamata aadapter.submitList(it)
. Il codice aggiornato è mostrato di seguito.
sleepTrackerViewModel.nights.observe(viewLifecycleOwner, Observer {
it?.let {
adapter.submitList(it)
}
})
- Esegui l'app. Viene eseguita più velocemente, anche se non in modo evidente se l'elenco è piccolo.
In questa attività, utilizzerai la stessa tecnica delle codelab precedenti per configurare il data binding ed eliminerai le chiamate a findViewById()
.
Passaggio 1: aggiungi il data binding al file di layout
- Apri il file di layout
list_item_sleep_night.xml
nella scheda Testo. - Posiziona il cursore sul tag
ConstraintLayout
e premiAlt+Enter
(Option+Enter
su Mac). Si apre il menu degli intenti (il menu "Correzione rapida"). - Seleziona Converti in layout di data binding. Il layout viene inserito in
<layout>
e viene aggiunto un tag<data>
all'interno. - Se necessario, scorri di nuovo verso l'alto e, all'interno del tag
<data>
, dichiara una variabile denominatasleep
. - Imposta
type
come nome completo diSleepNight
,com.example.android.trackmysleepquality.database.SleepNight
. Il tag<data>
completato dovrebbe avere l'aspetto mostrato di seguito.
<data>
<variable
name="sleep"
type="com.example.android.trackmysleepquality.database.SleepNight"/>
</data>
- Per forzare la creazione dell'oggetto
Binding
, seleziona Build > Clean Project, poi seleziona Build > Rebuild Project. Se i problemi persistono, seleziona File > Invalida cache / Riavvia. L'oggetto di bindingListItemSleepNightBinding
, insieme al codice correlato, viene aggiunto ai file generati del progetto.
Passaggio 2: gonfia il layout dell'elemento utilizzando il data binding
- Apri
SleepNightAdapter.kt
. - Nella classe
ViewHolder
, trova il metodofrom()
. - Elimina la dichiarazione della variabile
view
.
Codice da eliminare:
val view = layoutInflater
.inflate(R.layout.list_item_sleep_night, parent, false)
- Dove si trovava la variabile
view
, definisci una nuova variabile chiamatabinding
che aumenti l'oggetto di bindingListItemSleepNightBinding
, come mostrato di seguito. Esegui l'importazione necessaria dell'oggetto di binding.
val binding =
ListItemSleepNightBinding.inflate(layoutInflater, parent, false)
- Alla fine della funzione, anziché restituire
view
, restituiscibinding
.
return ViewHolder(binding)
- Per eliminare l'errore, posiziona il cursore sulla parola
binding
. PremiAlt+Enter
(Option+Enter
su Mac) per aprire il menu Intenzione.
- Seleziona Change parameter 'itemView' type of primary constructor of class 'ViewHolder' to 'ListItemSleepNightBinding'. Viene aggiornato il tipo di parametro della classe
ViewHolder
.
- Scorri verso l'alto fino alla definizione della classe
ViewHolder
per visualizzare la modifica nella firma. Viene visualizzato un errore peritemView
perché hai modificatoitemView
inbinding
nel metodofrom()
.
Nella definizione della classeViewHolder
, fai clic con il tasto destro del mouse su una delle occorrenze diitemView
e seleziona Refactor > Rename. Modifica il nome inbinding
. - Anteponi il parametro del costruttore
binding
aval
per renderlo una proprietà. - Nella chiamata alla classe padre,
RecyclerView.ViewHolder
, modifica il parametro dabinding
abinding.root
. Devi superare unView
ebinding.root
è laConstraintLayout
principale nel layout dell'elemento. - La dichiarazione della classe completata dovrebbe essere simile al codice riportato di seguito.
class ViewHolder private constructor(val binding: ListItemSleepNightBinding) : RecyclerView.ViewHolder(binding.root){
Viene visualizzato anche un errore per le chiamate a findViewById()
, che correggerai in un secondo momento.
Passaggio 3: sostituisci findViewById()
Ora puoi aggiornare le proprietà sleepLength
, quality
e qualityImage
per utilizzare l'oggetto binding
anziché findViewById()
.
- Modifica le inizializzazioni di
sleepLength
,qualityString
equalityImage
in modo che utilizzino le visualizzazioni dell'oggettobinding
, come mostrato di seguito. Dopodiché, il codice non dovrebbe più mostrare errori.
val sleepLength: TextView = binding.sleepLength
val quality: TextView = binding.qualityString
val qualityImage: ImageView = binding.qualityImage
Con l'oggetto di binding in posizione, non è più necessario definire le proprietà sleepLength
, quality
e qualityImage
. DataBinding
memorizzerà nella cache le ricerche, quindi non è necessario dichiarare queste proprietà.
- Fai clic con il tasto destro del mouse sui nomi delle proprietà
sleepLength
,quality
equalityImage
. Seleziona Refactor > Inline o premiControl+Command+N
(Option+Command+N
su Mac). - Esegui l'app. Potrebbe essere necessario pulire e ricompilare il progetto se contiene errori.
In questa attività, esegui l'upgrade dell'app per utilizzare il data binding con i binding adapter per impostare i dati nelle visualizzazioni.
In un precedente codelab, hai utilizzato la classe Transformations
per prendere LiveData
e generare stringhe formattate da visualizzare nelle visualizzazioni di testo. Tuttavia, se devi associare tipi diversi o complessi, puoi fornire adattatori di binding per aiutare il data binding a utilizzare questi tipi. Gli adattatori di binding prendono i tuoi dati e li adattano in modo che il data binding possa utilizzarli per associare una visualizzazione, ad esempio testo o un'immagine.
Implementerai tre adattatori di binding, uno per l'immagine di qualità e uno per ogni campo di testo. In sintesi, per dichiarare un adattatore di binding, definisci un metodo che accetta un elemento e una visualizzazione e lo annoti con @BindingAdapter
. Nel corpo del metodo, implementa la trasformazione. In Kotlin, puoi scrivere un adattatore di binding come funzione di estensione nella classe di visualizzazione che riceve i dati.
Passaggio 1: crea gli adattatori di binding
Tieni presente che dovrai importare un certo numero di corsi nel passaggio e non verranno indicati singolarmente.
- Apri
SleepNightAdapater.kt
. - All'interno della classe
ViewHolder
, trova il metodobind()
e ricorda a cosa serve. Prenderai il codice che calcola i valori perbinding.sleepLength
,binding.quality
ebinding.qualityImage
e lo utilizzerai all'interno dell'adattatore. Per il momento, lascia il codice così com'è. Lo sposterai in un passaggio successivo. - Nel pacchetto
sleeptracker
, crea e apri un file denominatoBindingUtils.kt
. - Dichiara una funzione di estensione su
TextView
, chiamatasetSleepDurationFormatted
, e passa unSleepNight
. Questa funzione sarà il tuo adattatore per calcolare e formattare la durata del sonno.
fun TextView.setSleepDurationFormatted(item: SleepNight) {}
- Nel corpo di
setSleepDurationFormatted
, associa i dati alla visualizzazione come hai fatto inViewHolder.bind()
. ChiamaconvertDurationToFormatted()
e poi impostatext
diTextView
sul testo formattato. Poiché si tratta di una funzione di estensione suTextView
, puoi accedere direttamente alla proprietàtext
.
text = convertDurationToFormatted(item.startTimeMilli, item.endTimeMilli, context.resources)
- Per comunicare al data binding questo adattatore di binding, annota la funzione con
@BindingAdapter
. - Questa funzione è l'adattatore per l'attributo
sleepDurationFormatted
, quindi passasleepDurationFormatted
come argomento a@BindingAdapter
.
@BindingAdapter("sleepDurationFormatted")
- Il secondo adattatore imposta la qualità del sonno in base al valore di un oggetto
SleepNight
. Crea una funzione di estensione chiamatasetSleepQualityString()
suTextView
e trasmetti unSleepNight
. - Nel corpo, associa i dati alla visualizzazione come hai fatto in
ViewHolder.bind()
. ChiamaconvertNumericQualityToString
e impostatext
. - Annota la funzione con
@BindingAdapter("sleepQualityString")
.
@BindingAdapter("sleepQualityString")
fun TextView.setSleepQualityString(item: SleepNight) {
text = convertNumericQualityToString(item.sleepQuality, context.resources)
}
- Il terzo adattatore di binding imposta l'immagine su una visualizzazione immagine. Crea la funzione di estensione su
ImageView
, chiamasetSleepImage
e utilizza il codice diViewHolder.bind()
, come mostrato di seguito.
@BindingAdapter("sleepImage")
fun ImageView.setSleepImage(item: SleepNight) {
setImageResource(when (item.sleepQuality) {
0 -> R.drawable.ic_sleep_0
1 -> R.drawable.ic_sleep_1
2 -> R.drawable.ic_sleep_2
3 -> R.drawable.ic_sleep_3
4 -> R.drawable.ic_sleep_4
5 -> R.drawable.ic_sleep_5
else -> R.drawable.ic_sleep_active
})
}
Passaggio 2: aggiorna SleepNightAdapter
- Apri
SleepNightAdapter.kt
. - Elimina tutto ciò che è presente nel metodo
bind()
, perché ora puoi utilizzare il data binding e i nuovi adattatori per svolgere questo lavoro.
fun bind(item: SleepNight) {
}
- All'interno di
bind()
, assegna la sospensione aitem
, perché devi comunicare all'oggetto di binding il nuovoSleepNight
.
binding.sleep = item
- Sotto questa riga, aggiungi
binding.executePendingBindings()
. Questa chiamata è un'ottimizzazione che chiede all'associazione di dati di eseguire immediatamente tutte le associazioni in attesa. È sempre una buona idea chiamareexecutePendingBindings()
quando utilizzi adattatori di binding in unRecyclerView
, perché può velocizzare leggermente il dimensionamento delle visualizzazioni.
binding.executePendingBindings()
Passaggio 3: aggiungi i binding al layout XML
- Apri
list_item_sleep_night.xml
. - In
ImageView
, aggiungi una proprietàapp
con lo stesso nome dell'adattatore di binding che imposta l'immagine. Passa la variabilesleep
, come mostrato di seguito.
Questa proprietà crea la connessione tra la visualizzazione e l'oggetto di binding tramite l'adattatore. Ogni volta che viene fatto riferimento asleepImage
, l'adattatore adatta i dati diSleepNight
.
app:sleepImage="@{sleep}"
- Fai lo stesso per le visualizzazioni di testo
sleep_length
equality_string
. Ogni volta che viene fatto riferimento asleepDurationFormatted
osleepQualityString
, gli adattatori adattano i dati diSleepNight
.
app:sleepDurationFormatted="@{sleep}"
app:sleepQualityString="@{sleep}"
- Esegui l'app. Funziona esattamente come prima. Gli adattatori di binding si occupano di tutto il lavoro di formattazione e aggiornamento delle visualizzazioni man mano che i dati cambiano, semplificando
ViewHolder
e dando al codice una struttura molto migliore rispetto a prima.
Hai visualizzato lo stesso elenco per gli ultimi esercizi. È una scelta progettuale, per mostrarti che l'interfaccia Adapter
ti consente di strutturare il codice in molti modi diversi. Più complesso è il codice, più importante diventa progettarlo bene. Nelle app di produzione, questi pattern e altri vengono utilizzati con RecyclerView
. Tutti i pattern funzionano e ognuno ha i suoi vantaggi. La scelta dipende da ciò che stai creando.
Complimenti! A questo punto, sei sulla buona strada per padroneggiare RecyclerView
su Android.
Progetto Android Studio: RecyclerViewDiffUtilDataBinding.
DiffUtil
:
RecyclerView
ha una classe chiamataDiffUtil
che serve per calcolare le differenze tra due elenchi.DiffUtil
ha una classe chiamataItemCallBack
che estendi per capire la differenza tra due elenchi.- Nella classe
ItemCallback
, devi eseguire l'override dei metodiareItemsTheSame()
eareContentsTheSame()
.
ListAdapter
:
- Per gestire senza costi alcune liste, puoi utilizzare la classe
ListAdapter
anzichéRecyclerView.Adapter
. Tuttavia, se utilizziListAdapter
, devi scrivere il tuo adattatore per altri layout, motivo per cui questo codelab ti mostra come farlo. - Per aprire il menu delle intenzioni in Android Studio, posiziona il cursore su qualsiasi elemento di codice e premi
Alt+Enter
(Option+Enter
su Mac). Questo menu è particolarmente utile per il refactoring del codice e la creazione di stub per l'implementazione dei metodi. Il menu è sensibile al contesto, quindi devi posizionare il cursore esattamente per visualizzare il menu corretto.
Associazione di dati:
- Utilizza il data binding nel layout dell'elemento per associare i dati alle visualizzazioni.
Adattatori per attacchi:
- In precedenza hai utilizzato
Transformations
per creare stringhe dai dati. Se devi associare dati di tipi diversi o complessi, fornisci adattatori di binding per consentire al data binding di utilizzarli. - Per dichiarare un adattatore di binding, definisci un metodo che accetta un elemento e una visualizzazione e annota il metodo con
@BindingAdapter
. In Kotlin, puoi scrivere l'adattatore di binding come funzione di estensione suView
. Inserisci il nome della proprietà che l'adattatore adatta. Ad esempio:
@BindingAdapter("sleepDurationFormatted")
- Nel layout XML, imposta una proprietà
app
con lo stesso nome dell'adattatore di binding. Passa una variabile con i dati. Ad esempio:
.app:sleepDurationFormatted="@{sleep}"
Corsi Udacity:
Documentazione per sviluppatori Android:
- Creare un elenco con RecyclerView
RecyclerView
DiffUtil
- Libreria Data Binding
- Adattatori per attacchi
notifyDataSetChanged()
Transformations
Altre risorse:
Questa sezione elenca i possibili compiti a casa per gli studenti che seguono questo codelab nell'ambito di un corso guidato da un insegnante. Spetta all'insegnante:
- Assegna i compiti, se richiesto.
- Comunica agli studenti come inviare i compiti.
- Valuta i compiti a casa.
Gli insegnanti possono utilizzare questi suggerimenti nella misura che ritengono opportuna e sono liberi di assegnare qualsiasi altro compito a casa che ritengono appropriato.
Se stai seguendo questo codelab in autonomia, sentiti libero di utilizzare questi compiti per casa per mettere alla prova le tue conoscenze.
Rispondi a queste domande
Domanda 1
Quali dei seguenti elementi sono necessari per utilizzare DiffUtil
? Seleziona tutte le opzioni pertinenti.
▢ Estendi il corso ItemCallBack
.
▢ Override areItemsTheSame()
.
▢ Override areContentsTheSame()
.
▢ Utilizza il data binding per monitorare le differenze tra gli elementi.
Domanda 2
Quali delle seguenti affermazioni sugli adattatori di binding sono vere?
▢ Un adattatore di binding è una funzione annotata con @BindingAdapter
.
▢ L'utilizzo di un binding adapter consente di separare la formattazione dei dati dal view holder.
▢ Devi utilizzare un RecyclerViewAdapter
se vuoi utilizzare gli adattatori di binding.
▢ Gli adattatori di binding sono una buona soluzione quando devi trasformare dati complessi.
Domanda 3
Quando dovresti prendere in considerazione l'utilizzo di Transformations
anziché un binding adapter? Seleziona tutte le opzioni pertinenti.
▢ I tuoi dati sono semplici.
▢ Stai formattando una stringa.
▢ Il tuo elenco è molto lungo.
▢ La tua ViewHolder
contiene una sola visualizzazione.
Inizia la lezione successiva: