Codelab ini adalah bagian dari kursus Dasar-Dasar Kotlin Android. Anda akan mendapatkan manfaat maksimal dari kursus ini jika Anda mengerjakan codelab secara berurutan. Semua codelab kursus tercantum di halaman landing codelab Dasar-Dasar Android Kotlin.
Pengantar
Di codelab sebelumnya, Anda mengupdate aplikasi TrackMySleepQuality untuk menampilkan data tentang kualitas tidur di RecyclerView
. Teknik yang Anda pelajari saat membuat RecyclerView
pertama cukup untuk sebagian besar RecyclerViews
yang menampilkan daftar sederhana yang tidak terlalu besar. Namun, ada sejumlah teknik yang membuat RecyclerView
lebih efisien untuk daftar besar dan membuat kode Anda lebih mudah dikelola dan diperluas untuk daftar dan petak yang kompleks.
Dalam codelab ini, Anda akan membuat aplikasi pelacak tidur dari codelab sebelumnya. Anda akan mempelajari cara yang lebih efektif untuk memperbarui daftar data tidur, dan mempelajari cara menggunakan data binding dengan RecyclerView
. (Jika Anda tidak memiliki aplikasi dari codelab sebelumnya, Anda dapat mendownload kode awal untuk codelab ini.)
Yang harus sudah Anda ketahui
- Membuat antarmuka pengguna dasar menggunakan aktivitas, fragmen, dan tampilan.
- Menavigasi antar-fragmen, dan menggunakan
safeArgs
untuk meneruskan data antar-fragmen. - Lihat model, lihat pabrik model, transformasi, dan
LiveData
serta pengamatnya. - Cara membuat database
Room
, membuat DAO, dan menentukan entity. - Cara menggunakan coroutine untuk database dan tugas lain yang berjalan lama.
- Cara menerapkan
RecyclerView
dasar denganAdapter
,ViewHolder
, dan tata letak item.
Yang akan Anda pelajari
- Cara menggunakan
DiffUtil
untuk memperbarui daftar yang ditampilkan olehRecyclerView
secara efisien. - Cara menggunakan data binding dengan
RecyclerView
. - Cara menggunakan adaptor binding untuk mentransformasi data.
Yang akan Anda lakukan
- Buat aplikasi TrackMySleepQuality dari codelab sebelumnya dalam seri ini.
- Perbarui
SleepNightAdapter
untuk memperbarui daftar secara efisien menggunakanDiffUtil
. - Terapkan data binding untuk
RecyclerView
, menggunakan adaptor binding untuk mengubah data.
Aplikasi pelacak tidur memiliki dua layar, diwakili oleh fragmen, seperti yang ditampilkan dalam gambar di bawah ini.
Layar pertama, yang ditampilkan di sebelah kiri, memiliki tombol untuk memulai dan menghentikan pelacakan. Layar menampilkan beberapa data tidur pengguna. Tombol Hapus secara permanen menghapus semua data yang telah dikumpulkan oleh aplikasi untuk pengguna. Layar kedua, yang ditampilkan di sebelah kanan, adalah untuk memilih rating kualitas tidur.
Aplikasi ini dirancang untuk menggunakan pengontrol UI, ViewModel
dan LiveData
, serta database Room
untuk mempertahankan data tidur.
Data tidur ditampilkan di RecyclerView
. Dalam codelab ini, Anda akan membuat DiffUtil
dan bagian data binding untuk RecyclerView
. Setelah codelab ini, aplikasi Anda akan terlihat sama persis, tetapi akan lebih efisien dan lebih mudah untuk diskalakan dan dikelola.
Anda dapat terus menggunakan aplikasi SleepTracker dari codelab sebelumnya, atau Anda dapat mendownload aplikasi RecyclerViewDiffUtilDataBinding-Starter dari GitHub.
- Jika perlu, download aplikasi RecyclerViewDiffUtilDataBinding-Starter dari GitHub dan buka project di Android Studio.
- Jalankan aplikasi.
- Buka file
SleepNightAdapter.kt
. - Periksa kode untuk membiasakan diri dengan struktur aplikasi. Lihat diagram di bawah untuk mengetahui rangkuman penggunaan
RecyclerView
dengan pola adaptor untuk menampilkan data tidur kepada pengguna.
- Dari input pengguna, aplikasi akan membuat daftar objek
SleepNight
. Setiap objekSleepNight
mewakili satu malam tidur, durasi, dan kualitasnya. SleepNightAdapter
menyesuaikan daftar objekSleepNight
menjadi sesuatu yang dapat digunakan dan ditampilkan olehRecyclerView
.- Adaptor
SleepNightAdapter
menghasilkanViewHolders
yang berisi tampilan, data, dan informasi meta untuk tampilan recycler yang menampilkan data tersebut. RecyclerView
menggunakanSleepNightAdapter
untuk menentukan jumlah item yang akan ditampilkan (getItemCount()
).RecyclerView
menggunakanonCreateViewHolder()
danonBindViewHolder()
untuk mendapatkan holder tampilan yang terikat dengan data untuk ditampilkan.
Metode notifyDataSetChanged() tidak efisien
Untuk memberi tahu RecyclerView
bahwa item dalam daftar telah berubah dan perlu diperbarui, kode saat ini akan memanggil notifyDataSetChanged()
di SleepNightAdapter
, seperti ditunjukkan di bawah ini.
var data = listOf<SleepNight>()
set(value) {
field = value
notifyDataSetChanged()
}
Namun, notifyDataSetChanged()
memberi tahu RecyclerView
bahwa seluruh daftar mungkin tidak valid. Akibatnya, RecyclerView
mengikat ulang dan menggambar ulang setiap item dalam daftar, termasuk item yang tidak terlihat di layar. Banyak sekali pekerjaan yang tidak perlu. Untuk daftar besar atau kompleks, proses ini dapat memakan waktu cukup lama sehingga tampilan berkedip atau tersendat-sendat saat pengguna men-scroll daftar.
Untuk memperbaiki masalah ini, Anda dapat memberi tahu RecyclerView
secara persis apa yang telah berubah. RecyclerView
kemudian dapat memperbarui hanya tampilan yang berubah di layar.
RecyclerView
memiliki API yang lengkap untuk memperbarui elemen tunggal. Anda dapat menggunakan notifyItemChanged()
untuk memberi tahu RecyclerView
bahwa sebuah item telah diubah, dan Anda dapat menggunakan fungsi serupa untuk item yang ditambahkan, dihapus, atau dipindahkan. Anda dapat melakukannya secara manual, tetapi tugasnya tidak akan sulit dan mungkin melibatkan sedikit kode.
Untungnya, ada cara yang lebih baik.
DiffUtil efisien dan melakukan kerja keras untuk Anda
RecyclerView
memiliki class yang disebut DiffUtil
yang digunakan untuk menghitung perbedaan antara dua daftar. DiffUtil
mengambil daftar lama serta daftar baru dan mencari tahu perbedaannya. Aplikasi ini akan menemukan item yang ditambahkan, dihapus, atau diubah. Lalu, algoritme menggunakan nama Eugene W. Algoritme perbedaan Myers untuk mengetahui jumlah minimum perubahan yang harus dilakukan dari daftar lama untuk membuat daftar baru.
Setelah DiffUtil
mengetahui apa saja yang berubah, RecyclerView
dapat menggunakan informasi tersebut untuk hanya memperbarui item yang diubah, ditambahkan, dihapus, atau dipindahkan, yang jauh lebih efisien daripada mengulangi seluruh daftar.
Dalam tugas ini, Anda mengupgrade SleepNightAdapter
untuk menggunakan DiffUtil
guna mengoptimalkan RecyclerView
untuk perubahan data.
Langkah 1: Mengimplementasikan SleepNightDiffCallback
Untuk menggunakan fungsi class DiffUtil
, perluas DiffUtil.ItemCallback
.
- Buka
SleepNightAdapter.kt
. - Di bawah definisi class lengkap untuk
SleepNightAdapter
, buat class tingkat atas baru yang disebutSleepNightDiffCallback
yang memperluasDiffUtil.ItemCallback
. TeruskanSleepNight
sebagai parameter generik.
class SleepNightDiffCallback : DiffUtil.ItemCallback<SleepNight>() {
}
- Letakkan kursor di nama class
SleepNightDiffCallback
. - Tekan
Alt+Enter
(Option+Enter
di Mac) dan pilih Implementasikan Anggota. - Pada dialog yang terbuka, geser ke kiri-klik untuk memilih metode
areItemsTheSame()
danareContentsTheSame()
, lalu klik Oke.
Tindakan ini akan menghasilkan stub di dalamSleepNightDiffCallback
untuk kedua metode, seperti yang ditunjukkan di bawah ini.DiffUtil
menggunakan dua metode ini untuk mengetahui perubahan daftar dan item.
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.
}
- Di dalam
areItemsTheSame()
, gantiTODO
dengan kode yang menguji apakah kedua itemSleepNight
yang diteruskan,oldItem
dannewItem
, sama. Jika item memilikinightId
yang sama, keduanya adalah item yang sama, jadi tampilkantrue
. Jika tidak, tampilkanfalse
.DiffUtil
menggunakan pengujian ini untuk membantu mengetahui apakah item ditambahkan, dihapus, atau dipindahkan.
override fun areItemsTheSame(oldItem: SleepNight, newItem: SleepNight): Boolean {
return oldItem.nightId == newItem.nightId
}
- Di dalam
areContentsTheSame()
, periksa apakaholdItem
dannewItem
berisi data yang sama; yaitu, apakah keduanya sama. Pemeriksaan kesetaraan ini akan memeriksa semua kolom, karenaSleepNight
adalah class data. ClassData
otomatis menentukanequals
dan beberapa metode lainnya untuk Anda. Jika ada perbedaan antaraoldItem
dannewItem
, kode ini akan memberi tahuDiffUtil
bahwa item telah diperbarui.
override fun areContentsTheSame(oldItem: SleepNight, newItem: SleepNight): Boolean {
return oldItem == newItem
}
Pola RecyclerView
yang umum digunakan adalah untuk menampilkan daftar yang berubah. RecyclerView
menyediakan class adaptor, ListAdapter
, yang membantu Anda membuat adaptor RecyclerView
yang didukung oleh daftar.
ListAdapter
terus melacak daftar dan memberi tahu adaptor saat daftar diperbarui.
Langkah 1: Ubah adaptor Anda untuk memperluas ListAdapter
- Di file
SleepNightAdapter.kt
, ubah tanda tangan classSleepNightAdapter
untuk memperluasListAdapter
. - Jika diminta, impor
androidx.recyclerview.widget.ListAdapter
. - Tambahkan
SleepNight
sebagai argumen pertama keListAdapter
, sebelumSleepNightAdapter.ViewHolder
. - Tambahkan
SleepNightDiffCallback()
sebagai parameter ke konstruktor.ListAdapter
akan menggunakan ini untuk mencari tahu apa yang berubah dalam daftar. Tanda tangan classSleepNightAdapter
Anda yang sudah selesai akan terlihat seperti yang ditunjukkan di bawah ini.
class SleepNightAdapter : ListAdapter<SleepNight, SleepNightAdapter.ViewHolder>(SleepNightDiffCallback()) {
- Di dalam class
SleepNightAdapter
, hapus kolomdata
, termasuk penyetel. Anda tidak membutuhkannya lagi, karenaListAdapter
melacak daftar untuk Anda. - Hapus penggantian
getItemCount()
, karenaListAdapter
menerapkan metode ini untuk Anda. - Untuk menghilangkan error di
onBindViewHolder()
, ubah variabelitem
. Daripada menggunakandata
untuk mendapatkanitem
, panggil metodegetItem(position)
yang disediakanListAdapter
.
val item = getItem(position)
Langkah 2: Gunakan SubmitList() untuk terus memperbarui daftar
Kode Anda perlu memberi tahu ListAdapter
saat daftar yang berubah tersedia. ListAdapter
menyediakan metode bernama submitList()
untuk memberi tahu ListAdapter
bahwa versi baru daftar tersebut tersedia. Saat metode ini dipanggil, ListAdapter
akan membedakan daftar baru dengan daftar lama dan mendeteksi item yang ditambahkan, dihapus, dipindahkan, atau diubah. Kemudian, ListAdapter
akan memperbarui item yang ditampilkan oleh RecyclerView
.
- Buka
SleepTrackerFragment.kt
. - Pada
onCreateView()
, dalam observer disleepTrackerViewModel
, temukan error yang merujuk ke variabeldata
yang telah Anda hapus. - Ganti
adapter.data = it
dengan panggilan keadapter.submitList(it)
. Kode yang diperbarui ditampilkan di bawah ini.
sleepTrackerViewModel.nights.observe(viewLifecycleOwner, Observer {
it?.let {
adapter.submitList(it)
}
})
- Jalankan aplikasi Anda. Aplikasi akan berjalan lebih cepat, mungkin tidak terasa jika daftar Anda sedikit.
Dalam tugas ini, Anda menggunakan teknik yang sama seperti di codelab sebelumnya untuk menyiapkan data binding, dan menghapus panggilan ke findViewById()
.
Langkah 1: Tambahkan data binding ke file tata letak
- Buka file tata letak
list_item_sleep_night.xml
di tab Text. - Letakkan kursor pada tag
ConstraintLayout
dan tekanAlt+Enter
(Option+Enter
di Mac). Menu intent (menu "perbaikan cepat" akan terbuka. - Pilih Konversikan ke tata letak data binding. Ini akan menggabungkan tata letak ke dalam
<layout>
dan menambahkan tag<data>
di dalamnya. - Scroll kembali ke atas, jika perlu, dan di dalam tag
<data>
, deklarasikan variabel bernamasleep
. - Jadikan
type
miliknya nama yang sepenuhnya memenuhi syarat dariSleepNight
,com.example.android.trackmysleepquality.database.SleepNight
. Tag<data>
yang sudah selesai akan terlihat seperti di bawah ini.
<data>
<variable
name="sleep"
type="com.example.android.trackmysleepquality.database.SleepNight"/>
</data>
- Untuk memaksa pembuatan objek
Binding
, pilih Build > Clean Project, lalu pilih Build > Rebuild Project. (Jika Anda masih mengalami masalah, pilih File > Invalidate Caches / Restart.) Objek bindingListItemSleepNightBinding
, beserta kode terkait, ditambahkan ke file yang dihasilkan project.
Langkah 2: Meng-inflate tata letak item menggunakan data binding
- Buka
SleepNightAdapter.kt
. - Di class
ViewHolder
, temukan metodefrom()
. - Hapus deklarasi variabel
view
.
Kode yang akan dihapus:
val view = layoutInflater
.inflate(R.layout.list_item_sleep_night, parent, false)
- Jika variabel
view
berada, tentukan variabel baru bernamabinding
yang meng-inflate objek bindingListItemSleepNightBinding
, seperti yang ditunjukkan di bawah. Lakukan impor objek binding yang diperlukan.
val binding =
ListItemSleepNightBinding.inflate(layoutInflater, parent, false)
- Di akhir fungsi, tampilkan
binding
, bukan menampilkanview
.
return ViewHolder(binding)
- Untuk mengatasi error, tempatkan kursor pada kata
binding
. TekanAlt+Enter
(Option+Enter
di Mac) untuk membuka menu intent.
- Pilih Ubah parameter 'itemView' jenis konstruktor utama class 'ViewHolder' menjadi 'ListItemSleepNightBinding'. Ini akan memperbarui jenis parameter class
ViewHolder
.
- Scroll ke atas ke definisi class
ViewHolder
untuk melihat perubahan di tanda tangan. Anda melihat error untukitemView
, karena Anda mengubahitemView
menjadibinding
dalam metodefrom()
.
Pada definisi classViewHolder
, klik kanan pada salah satu kemunculanitemView
, lalu pilih Refactor > Rename. Ubah nama menjadibinding
. - Awali parameter konstruktor
binding
denganval
untuk menjadikannya properti. - Dalam panggilan ke class induk,
RecyclerView.ViewHolder
, ubah parameter daribinding
menjadibinding.root
. Anda harus meneruskanView
, danbinding.root
adalah rootConstraintLayout
dalam tata letak item Anda. - Deklarasi class yang sudah selesai akan terlihat seperti kode di bawah ini.
class ViewHolder private constructor(val binding: ListItemSleepNightBinding) : RecyclerView.ViewHolder(binding.root){
Anda juga melihat error untuk panggilan ke findViewById()
, dan Anda akan memperbaikinya nanti.
Langkah 3: Ganti findViewById()
Anda kini dapat memperbarui properti sleepLength
, quality
, dan qualityImage
untuk menggunakan objek binding
, bukan findViewById()
.
- Ubah inisialisasi
sleepLength
,qualityString
, danqualityImage
agar menggunakan tampilan objekbinding
, seperti yang ditunjukkan di bawah. Setelah itu, kode Anda tidak akan menampilkan error lagi.
val sleepLength: TextView = binding.sleepLength
val quality: TextView = binding.qualityString
val qualityImage: ImageView = binding.qualityImage
Dengan objek binding yang diterapkan, Anda tidak perlu lagi menentukan properti sleepLength
, quality
, dan qualityImage
. DataBinding
akan meng-cache pencarian, sehingga tidak perlu mendeklarasikan properti tersebut.
- Klik kanan nama properti
sleepLength
,quality
, danqualityImage
. Pilih Refactor > Inline, atau tekanControl+Command+N
(Option+Command+N
di Mac). - Jalankan aplikasi Anda. (Anda mungkin perlu Membersihkan dan Membuat ulang project jika terdapat error.)
Dalam tugas ini, Anda akan mengupgrade aplikasi untuk menggunakan data binding dengan adaptor binding untuk menyetel data dalam tampilan Anda.
Di codelab sebelumnya, Anda menggunakan class Transformations
untuk mengambil LiveData
dan membuat string berformat untuk ditampilkan dalam tampilan teks. Namun, jika perlu mengikat jenis yang berbeda, atau jenis yang kompleks, Anda dapat menyediakan adaptor binding untuk membantu data binding menggunakan jenis tersebut. Adaptor binding adalah adaptor yang mengambil data Anda dan menyesuaikannya menjadi sesuatu yang dapat digunakan data binding untuk mengikat tampilan, seperti teks atau gambar.
Anda akan menerapkan tiga adaptor binding, satu untuk gambar berkualitas, dan satu untuk setiap kolom teks. Singkatnya, untuk mendeklarasikan adaptor binding, tentukan metode yang mengambil item dan tampilan, lalu menganotasinya dengan @BindingAdapter
. Di bagian isi metode, Anda akan mengimplementasikan transformasi. Di Kotlin, Anda dapat menulis adaptor binding sebagai fungsi ekstensi pada class tampilan yang menerima data.
Langkah 1: Buat adaptor binding
Perhatikan bahwa Anda harus mengimpor sejumlah class pada langkah, dan class tersebut tidak akan dipanggil satu per satu.
- Buka
SleepNightAdapater.kt
. - Di dalam class
ViewHolder
, temukan metodebind()
dan ingatkan diri Anda tentang fungsi metode ini. Anda akan mengambil kode yang menghitung nilai untukbinding.sleepLength
,binding.quality
, danbinding.qualityImage
, lalu menggunakannya di dalam adaptor. (Untuk saat ini, jangan ubah kode; Anda memindahkannya pada langkah selanjutnya.) - Dalam paket
sleeptracker
, buat dan buka file bernamaBindingUtils.kt
. - Deklarasikan fungsi ekstensi di
TextView
, yang disebutsetSleepDurationFormatted
, dan teruskanSleepNight
. Fungsi ini akan menjadi adaptor Anda untuk menghitung dan memformat durasi tidur.
fun TextView.setSleepDurationFormatted(item: SleepNight) {}
- Di bagian isi
setSleepDurationFormatted
, ikat data ke tampilan seperti yang Anda lakukan diViewHolder.bind()
. PanggilconvertDurationToFormatted()
, lalu tetapkantext
TextView
ke teks berformat. (Karena ini adalah fungsi ekstensi padaTextView
, Anda dapat langsung mengakses propertitext
.)
text = convertDurationToFormatted(item.startTimeMilli, item.endTimeMilli, context.resources)
- Untuk memberi tahu data binding tentang adaptor binding ini, anotasikan fungsi dengan
@BindingAdapter
. - Fungsi ini adalah adaptor untuk atribut
sleepDurationFormatted
, jadi teruskansleepDurationFormatted
sebagai argumen ke@BindingAdapter
.
@BindingAdapter("sleepDurationFormatted")
- Adaptor kedua menetapkan kualitas tidur berdasarkan nilai dalam objek
SleepNight
. Buat fungsi ekstensi bernamasetSleepQualityString()
diTextView
, dan masukkanSleepNight
. - Di bagian isi, ikat data dengan tampilan seperti yang Anda lakukan di
ViewHolder.bind()
. PanggilconvertNumericQualityToString
dan seteltext
. - Anotasi fungsi dengan
@BindingAdapter("sleepQualityString")
.
@BindingAdapter("sleepQualityString")
fun TextView.setSleepQualityString(item: SleepNight) {
text = convertNumericQualityToString(item.sleepQuality, context.resources)
}
- Adaptor binding ketiga menyetel gambar pada tampilan gambar. Buat fungsi ekstensi di
ImageView
, panggilsetSleepImage
, dan gunakan kode dariViewHolder.bind()
, seperti yang ditunjukkan di bawah ini.
@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
})
}
Langkah 2: Perbarui SleepNightAdapter
- Buka
SleepNightAdapter.kt
. - Hapus semuanya di metode
bind()
karena Anda sekarang dapat menggunakan data binding dan adaptor baru untuk melakukan ini untuk Anda.
fun bind(item: SleepNight) {
}
- Di dalam
bind()
, tetapkan tidur keitem
, karena Anda perlu memberi tahu objek binding tentangSleepNight
baru Anda.
binding.sleep = item
- Di bawah baris tersebut, tambahkan
binding.executePendingBindings()
. Panggilan ini adalah pengoptimalan yang meminta data binding untuk langsung mengeksekusi binding yang tertunda. Sebaiknya panggilexecutePendingBindings()
saat Anda menggunakan adaptor binding diRecyclerView
, karena dapat sedikit mempercepat tampilan.
binding.executePendingBindings()
Langkah 3: Tambahkan binding ke tata letak XML
- Buka
list_item_sleep_night.xml
. - Di
ImageView
, tambahkan propertiapp
dengan nama yang sama seperti adaptor binding yang menyetel gambar. Teruskan variabelsleep
, seperti yang ditunjukkan di bawah ini.
Properti ini membuat hubungan antara tampilan dan objek binding, melalui adaptor. Setiap kalisleepImage
direferensikan, adaptor akan menyesuaikan data dariSleepNight
.
app:sleepImage="@{sleep}"
- Lakukan hal yang sama untuk tampilan teks
sleep_length
danquality_string
. Setiap kalisleepDurationFormatted
atausleepQualityString
direferensikan, adaptor akan menyesuaikan data dariSleepNight
.
app:sleepDurationFormatted="@{sleep}"
app:sleepQualityString="@{sleep}"
- Jalankan aplikasi Anda. Cara kerjanya sama persis seperti sebelumnya. Adaptor binding menangani semua pekerjaan memformat dan memperbarui tampilan saat data berubah, menyederhanakan
ViewHolder
, dan memberikan kode struktur yang jauh lebih baik daripada sebelumnya.
Anda telah menampilkan daftar yang sama untuk beberapa latihan terakhir. Hal tersebut dilakukan agar dapat menunjukkan bahwa antarmuka Adapter
memungkinkan Anda merancang kode dengan berbagai cara. Semakin kompleks kode Anda, semakin penting untuk merancangnya dengan baik. Dalam aplikasi produksi, pola ini dan yang lainnya digunakan dengan RecyclerView
. Semua pola berfungsi, dan masing-masing memiliki manfaatnya. Cara yang Anda pilih bergantung pada apa yang sedang Anda buat.
Selamat! Pada tahap ini, Anda sudah menguasai RecyclerView
di Android.
Project Android Studio: RecyclerViewDiffUtilDataBinding.
DiffUtil
:
RecyclerView
memiliki class yang disebutDiffUtil
yang digunakan untuk menghitung perbedaan antara dua daftar.DiffUtil
memiliki class bernamaItemCallBack
yang Anda perluas untuk mengetahui perbedaan antara dua daftar.- Di class
ItemCallback
, Anda harus mengganti metodeareItemsTheSame()
danareContentsTheSame()
.
ListAdapter
:
- Untuk mendapatkan beberapa pengelolaan daftar secara gratis, Anda dapat menggunakan class
ListAdapter
, bukanRecyclerView.Adapter
. Namun, jika menggunakanListAdapter
, Anda harus menulis adaptor sendiri untuk tata letak lain, itulah sebabnya codelab ini menunjukkan cara melakukannya. - Untuk membuka menu intent di Android Studio, arahkan kursor ke item kode apa pun dan tekan
Alt+Enter
(Option+Enter
di Mac). Menu ini sangat berguna untuk memfaktorkan ulang kode dan membuat stub untuk mengimplementasikan metode. Menu peka terhadap konteks, jadi Anda harus menempatkan kursor dengan tepat untuk mendapatkan menu yang benar.
Data binding:
- Gunakan data binding dalam tata letak item untuk mengikat data ke tampilan.
Adaptor binding:
- Sebelumnya Anda menggunakan
Transformations
untuk membuat string dari data. Jika Anda perlu mengikat data dari jenis yang berbeda atau kompleks, berikan adaptor binding untuk membantu data binding menggunakannya. - Untuk mendeklarasikan adaptor binding, tentukan metode yang menggunakan item dan tampilan, lalu beri anotasi metode dengan
@BindingAdapter
. Di Kotlin, Anda dapat menulis adaptor binding sebagai fungsi ekstensi diView
. Teruskan nama properti yang disesuaikan oleh adaptor. Misalnya:
@BindingAdapter("sleepDurationFormatted")
- Pada tata letak XML, tetapkan properti
app
dengan nama yang sama seperti adaptor binding. Teruskan variabel dengan data. Misalnya:
.app:sleepDurationFormatted="@{sleep}"
Kursus Udacity:
Dokumentasi developer Android:
- Membuat Daftar dengan RecyclerView
RecyclerView
DiffUtil
- Library Data Binding
- Adaptor binding
notifyDataSetChanged()
Transformations
Referensi lainnya:
Bagian ini mencantumkan kemungkinan tugas pekerjaan rumah untuk siswa yang mengerjakan codelab ini sebagai bagian dari kursus yang dipimpin oleh instruktur. Terserah instruktur untuk melakukan hal berikut:
- Tugaskan pekerjaan rumah jika diperlukan.
- Berkomunikasi dengan siswa cara mengirimkan tugas pekerjaan rumah.
- Beri nilai tugas pekerjaan rumah.
Instruktur dapat menggunakan saran ini sesedikit atau sebanyak yang mereka inginkan, dan harus bebas memberikan pekerjaan rumah lain yang dirasa sesuai.
Jika Anda mengerjakan codelab ini sendiri, silakan gunakan tugas pekerjaan rumah ini untuk menguji pengetahuan Anda.
Jawab pertanyaan berikut
Pertanyaan 1
Manakah dari hal berikut yang diperlukan untuk menggunakan DiffUtil
? Pilih semua yang sesuai.
▢ Perluas class ItemCallBack
.
▢ Ganti areItemsTheSame()
.
▢ Ganti areContentsTheSame()
.
▢ Menggunakan data binding untuk melacak perbedaan antar-item.
Pertanyaan 2
Manakah dari pernyataan berikut ini yang benar tentang adaptor binding?
▢ Adaptor binding adalah fungsi yang dianotasi dengan @BindingAdapter
.
▢ Menggunakan adaptor pengikat memungkinkan Anda memisahkan pemformatan data dari holder tampilan.
▢ Anda harus menggunakan RecyclerViewAdapter
jika ingin menggunakan adaptor binding.
▢ Adaptor binding adalah solusi yang tepat saat Anda perlu mengubah data yang kompleks.
Pertanyaan 3
Kapan sebaiknya Anda mempertimbangkan untuk menggunakan Transformations
dan bukan adaptor binding? Pilih semua yang sesuai.
▢ Data Anda sederhana.
▢ Anda memformat string.
▢ Daftar Anda sangat panjang.
▢ ViewHolder
Anda hanya berisi satu tampilan.
Mulai tutorial berikutnya: