Codelab ini adalah bagian dari kursus Dasar-Dasar Android Kotlin. Anda akan mendapatkan manfaat maksimal dari kursus ini jika menyelesaikan codelab secara berurutan. Semua codelab kursus tercantum di halaman landing codelab Dasar-Dasar Android Kotlin.
Pengantar
Di codelab sebelumnya, Anda telah memperbarui aplikasi TrackMySleepQuality untuk menampilkan data tentang kualitas tidur dalam RecyclerView
. Teknik yang Anda pelajari saat membuat RecyclerView
pertama sudah 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 mem-build aplikasi pelacak tidur dari codelab sebelumnya. Anda akan mempelajari cara yang lebih efektif untuk memperbarui daftar data tidur, dan Anda akan 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
- Membangun antarmuka pengguna dasar menggunakan aktivitas, fragmen, dan tampilan.
- Menavigasi antar-fragmen, dan menggunakan
safeArgs
untuk meneruskan data antar-fragmen. - Melihat model, melihat factory model, transformasi, dan
LiveData
serta pengamatnya. - Cara membuat database
Room
, membuat DAO, dan menentukan entity. - Cara menggunakan coroutine untuk database dan tugas berjalan lama lainnya.
- 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 mengubah data.
Yang akan Anda lakukan
- Bangun 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 mentransformasi data.
Aplikasi pelacak tidur memiliki dua layar, yang diwakili oleh fragmen, seperti yang ditunjukkan pada gambar di bawah.
Layar pertama, yang ditampilkan di sebelah kiri, memiliki tombol untuk memulai dan menghentikan pelacakan. Layar menampilkan beberapa data tidur pengguna. Tombol Hapus akan menghapus semua data yang telah dikumpulkan aplikasi untuk pengguna secara permanen. 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 dalam RecyclerView
. Dalam codelab ini, Anda akan mem-build bagian DiffUtil
dan pengikatan data untuk RecyclerView
. Setelah codelab ini, aplikasi Anda akan terlihat persis sama, tetapi akan lebih efisien dan lebih mudah diskalakan serta dikelola.
Anda dapat terus menggunakan aplikasi SleepTracker dari codelab sebelumnya, atau 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 memahami struktur aplikasi. Lihat diagram di bawah untuk ringkasan penggunaan
RecyclerView
dengan pola adapter untuk menampilkan data tidur kepada pengguna.
- Dari input pengguna, aplikasi 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 agar tampilan recycler dapat menampilkan data. RecyclerView
menggunakanSleepNightAdapter
untuk menentukan jumlah item yang akan ditampilkan (getItemCount()
).RecyclerView
menggunakanonCreateViewHolder()
danonBindViewHolder()
untuk mendapatkan pemegang tampilan yang terikat ke data untuk ditampilkan.
Metode notifyDataSetChanged() tidak efisien
Untuk memberi tahu RecyclerView
bahwa item dalam daftar telah berubah dan perlu diperbarui, kode saat ini memanggil notifyDataSetChanged()
di SleepNightAdapter
, seperti yang ditunjukkan di bawah.
var data = listOf<SleepNight>()
set(value) {
field = value
notifyDataSetChanged()
}
Namun, notifyDataSetChanged()
memberi tahu RecyclerView
bahwa seluruh daftar berpotensi tidak valid. Akibatnya, RecyclerView
mengikat ulang dan menggambar ulang setiap item dalam daftar, termasuk item yang tidak terlihat di layar. Ini adalah banyak pekerjaan yang tidak perlu. Untuk daftar yang besar atau kompleks, proses ini dapat memakan waktu cukup lama sehingga tampilan berkedip atau tersendat 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 lengkap untuk memperbarui satu elemen. Anda dapat menggunakan notifyItemChanged()
untuk memberi tahu RecyclerView
bahwa item telah berubah, dan Anda dapat menggunakan fungsi serupa untuk item yang ditambahkan, dihapus, atau dipindahkan. Anda dapat melakukannya secara manual, tetapi tugas tersebut tidaklah mudah dan mungkin melibatkan banyak kode.
Untungnya, ada cara yang lebih baik.
DiffUtil efisien dan melakukan pekerjaan sulit untuk Anda
RecyclerView
memiliki class bernama DiffUtil
yang digunakan untuk menghitung perbedaan antara dua daftar. DiffUtil
menggunakan daftar lama dan daftar baru, lalu mencari tahu apa yang berbeda. Fitur ini menemukan item yang ditambahkan, dihapus, atau diubah. Kemudian, algoritma ini menggunakan algoritma yang disebut Eugene W. Myers's difference algorithm untuk mengetahui jumlah minimum perubahan yang harus dilakukan dari daftar lama untuk menghasilkan daftar baru.
Setelah DiffUtil
mengetahui apa yang telah berubah, RecyclerView
dapat menggunakan informasi tersebut untuk memperbarui hanya item yang diubah, ditambahkan, dihapus, atau dipindahkan, yang jauh lebih efisien daripada mengulang seluruh daftar.
Dalam tugas ini, Anda mengupgrade SleepNightAdapter
untuk menggunakan DiffUtil
guna mengoptimalkan RecyclerView
untuk perubahan pada data.
Langkah 1: Terapkan SleepNightDiffCallback
Untuk menggunakan fungsi class DiffUtil
, perluas DiffUtil.ItemCallback
.
- Buka
SleepNightAdapter.kt
. - Di bawah definisi class lengkap untuk
SleepNightAdapter
, buat class tingkat teratas baru bernamaSleepNightDiffCallback
yang memperluasDiffUtil.ItemCallback
. TeruskanSleepNight
sebagai parameter generik.
class SleepNightDiffCallback : DiffUtil.ItemCallback<SleepNight>() {
}
- Tempatkan kursor di nama class
SleepNightDiffCallback
. - Tekan
Alt+Enter
(Option+Enter
di Mac) dan pilih Terapkan Anggota. - Pada dialog yang terbuka, klik kiri sambil menekan shift untuk memilih metode
areItemsTheSame()
danareContentsTheSame()
, lalu klik OK.
Tindakan ini akan membuat stub di dalamSleepNightDiffCallback
untuk kedua metode, seperti yang ditunjukkan di bawah.DiffUtil
menggunakan dua metode ini untuk mengetahui bagaimana daftar dan item telah berubah.
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 dua itemSleepNight
yang diteruskan,oldItem
dannewItem
, sama. Jika item memilikinightId
yang sama, item tersebut adalah item yang sama, jadi tampilkantrue
. Jika tidak, tampilkanfalse
.DiffUtil
menggunakan pengujian ini untuk membantu menemukan 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 memberi tahuDiffUtil
bahwa item telah diperbarui.
override fun areContentsTheSame(oldItem: SleepNight, newItem: SleepNight): Boolean {
return oldItem == newItem
}
Pola umum untuk menggunakan RecyclerView
adalah untuk menampilkan daftar yang berubah. RecyclerView
menyediakan class adaptor, ListAdapter
, yang membantu Anda membuat adaptor RecyclerView
yang didukung oleh daftar.
ListAdapter
melacak daftar untuk Anda dan memberi tahu adaptor saat daftar diperbarui.
Langkah 1: Ubah adaptor untuk memperluas ListAdapter
- Dalam 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 menggunakannya untuk mencari tahu apa yang berubah dalam daftar. Tanda tangan classSleepNightAdapter
yang sudah selesai akan terlihat seperti yang ditunjukkan di bawah.
class SleepNightAdapter : ListAdapter<SleepNight, SleepNightAdapter.ViewHolder>(SleepNightDiffCallback()) {
- Di dalam class
SleepNightAdapter
, hapus kolomdata
, termasuk setter. Anda tidak memerlukannya lagi, karenaListAdapter
melacak daftar untuk Anda. - Hapus penggantian
getItemCount()
, karenaListAdapter
mengimplementasikan 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 diubah tersedia. ListAdapter
menyediakan metode yang disebut submitList()
untuk memberi tahu ListAdapter
bahwa versi baru daftar tersedia. Saat metode ini dipanggil, ListAdapter
akan membandingkan daftar baru dengan daftar lama dan mendeteksi item yang ditambahkan, dihapus, dipindahkan, atau diubah. Kemudian, ListAdapter
memperbarui item yang ditampilkan oleh RecyclerView
.
- Buka
SleepTrackerFragment.kt
. - Di
onCreateView()
, di pengamat padasleepTrackerViewModel
, temukan error tempat variabeldata
yang telah Anda hapus dirujuk. - Ganti
adapter.data = it
dengan panggilan keadapter.submitList(it)
. Kode yang diperbarui ditampilkan di bawah.
sleepTrackerViewModel.nights.observe(viewLifecycleOwner, Observer {
it?.let {
adapter.submitList(it)
}
})
- Jalankan aplikasi Anda. Aplikasi akan berjalan lebih cepat, mungkin tidak terasa jika daftar Anda kecil.
Dalam tugas ini, Anda menggunakan teknik yang sama seperti di codelab sebelumnya untuk menyiapkan data binding, dan Anda menghilangkan panggilan ke findViewById()
.
Langkah 1: Tambahkan data binding ke file tata letak
- Buka file tata letak
list_item_sleep_night.xml
di tab Teks. - Letakkan kursor pada tag
ConstraintLayout
, lalu tekanAlt+Enter
(Option+Enter
di Mac). Menu niat (menu "perbaikan cepat") akan terbuka. - Pilih Konversi ke tata letak data binding. Tindakan ini akan membungkus tata letak ke dalam
<layout>
dan menambahkan tag<data>
di dalamnya. - Scroll kembali ke bagian atas, jika perlu, dan di dalam tag
<data>
, deklarasikan variabel bernamasleep
. - Jadikan
type
sebagai nama yang sepenuhnya memenuhi syarat dariSleepNight
,com.example.android.trackmysleepquality.database.SleepNight
. Tag<data>
yang sudah selesai akan terlihat seperti yang ditunjukkan di bawah.
<data>
<variable
name="sleep"
type="com.example.android.trackmysleepquality.database.SleepNight"/>
</data>
- Untuk memaksakan 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: Tampilkan tata letak item menggunakan data binding
- Buka
SleepNightAdapter.kt
. - Di class
ViewHolder
, temukan metodefrom()
. - Hapus deklarasi variabel
view
.
Kode untuk menghapus:
val view = layoutInflater
.inflate(R.layout.list_item_sleep_night, parent, false)
- Di tempat 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, alih-alih menampilkan
view
, tampilkanbinding
.
return ViewHolder(binding)
- Untuk menghilangkan error, letakkan kursor Anda pada kata
binding
. TekanAlt+Enter
(Option+Enter
di Mac) untuk membuka menu maksud.
- Pilih Ubah jenis parameter 'itemView' dari konstruktor utama class 'ViewHolder' menjadi 'ListItemSleepNightBinding'. Tindakan ini akan memperbarui jenis parameter class
ViewHolder
.
- Scroll ke atas ke definisi class
ViewHolder
untuk melihat perubahan pada tanda tangan. Anda akan melihat error untukitemView
, karena Anda mengubahitemView
menjadibinding
dalam metodefrom()
.
Dalam definisi classViewHolder
, klik kanan salah satu kemunculanitemView
, lalu pilih Refactor > Rename. Ubah namanya menjadibinding
. - Tambahkan awalan
val
pada parameter konstruktorbinding
untuk menjadikannya properti. - Dalam panggilan ke class induk,
RecyclerView.ViewHolder
, ubah parameter daribinding
menjadibinding.root
. Anda harus meneruskanView
, danbinding.root
adalahConstraintLayout
root dalam tata letak item Anda. - Deklarasi class yang sudah selesai akan terlihat seperti kode di bawah.
class ViewHolder private constructor(val binding: ListItemSleepNightBinding) : RecyclerView.ViewHolder(binding.root){
Anda juga melihat error untuk panggilan ke findViewById()
, dan Anda akan memperbaikinya berikutnya.
Langkah 3: Ganti findViewById()
Sekarang Anda dapat memperbarui properti sleepLength
, quality
, dan qualityImage
untuk menggunakan objek binding
, bukan findViewById()
.
- Ubah inisialisasi
sleepLength
,qualityString
, danqualityImage
untuk 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 adanya objek binding, Anda tidak perlu lagi menentukan properti sleepLength
, quality
, dan qualityImage
. DataBinding
akan meng-cache pencarian, jadi tidak perlu mendeklarasikan properti ini.
- 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 Membangun Ulang project jika ada error.)
Dalam tugas ini, Anda akan mengupgrade aplikasi untuk menggunakan data binding dengan adaptor binding guna menetapkan data dalam tampilan.
Dalam codelab sebelumnya, Anda menggunakan class Transformations
untuk mengambil LiveData
dan menghasilkan string berformat untuk ditampilkan dalam tampilan teks. Namun, jika Anda 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 adapter binding, satu untuk gambar berkualitas, dan satu untuk setiap kolom teks. Singkatnya, untuk mendeklarasikan adaptor binding, Anda menentukan metode yang mengambil item dan tampilan, lalu menganotasinya dengan @BindingAdapter
. Dalam isi metode, Anda akan menerapkan transformasi. Di Kotlin, Anda dapat menulis adaptor pengikatan sebagai fungsi ekstensi pada class tampilan yang menerima data.
Langkah 1: Buat adaptor pengikatan
Perhatikan bahwa Anda harus mengimpor sejumlah kelas dalam langkah ini, dan kelas tersebut tidak akan disebutkan 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, biarkan kode apa adanya; Anda akan memindahkannya pada langkah berikutnya.) - 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 isi
setSleepDurationFormatted
, ikat data ke tampilan seperti yang Anda lakukan diViewHolder.bind()
. PanggilconvertDurationToFormatted()
, lalu tetapkantext
dariTextView
ke teks yang diformat. (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
, lalu teruskanSleepNight
. - Di isi, ikat data ke tampilan seperti yang Anda lakukan di
ViewHolder.bind()
. PanggilconvertNumericQualityToString
dan tetapkantext
. - Anotasi fungsi dengan
@BindingAdapter("sleepQualityString")
.
@BindingAdapter("sleepQualityString")
fun TextView.setSleepQualityString(item: SleepNight) {
text = convertNumericQualityToString(item.sleepQuality, context.resources)
}
- Adaptor binding ketiga menetapkan gambar pada tampilan gambar. Buat fungsi ekstensi di
ImageView
, panggilsetSleepImage
, dan gunakan kode dariViewHolder.bind()
, seperti yang ditunjukkan di bawah.
@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: Update SleepNightAdapter
- Buka
SleepNightAdapter.kt
. - Hapus semuanya dalam metode
bind()
, karena Anda kini dapat menggunakan pengikatan data dan adaptor baru untuk melakukan pekerjaan ini.
fun bind(item: SleepNight) {
}
- Di dalam
bind()
, tetapkan sleep keitem
, karena Anda perlu memberi tahu objek pengikatan tentangSleepNight
baru.
binding.sleep = item
- Di bawah baris tersebut, tambahkan
binding.executePendingBindings()
. Panggilan ini adalah pengoptimalan yang meminta data binding untuk segera menjalankan binding yang tertunda. Sebaiknya panggilexecutePendingBindings()
saat Anda menggunakan adaptor binding dalamRecyclerView
, karena dapat sedikit mempercepat penentuan ukuran 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 dengan adaptor binding yang menyetel gambar. Teruskan variabelsleep
, seperti yang ditunjukkan di bawah.
Properti ini membuat koneksi antara tampilan dan objek binding, melalui adaptor. Setiap kalisleepImage
dirujuk, adaptor akan mengadaptasi 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. Aplikasi akan berfungsi persis sama seperti sebelumnya. Adaptor pengikatan menangani semua tugas pemformatan dan memperbarui tampilan saat data berubah, menyederhanakan
ViewHolder
dan memberikan struktur kode yang jauh lebih baik daripada sebelumnya.
Anda telah menampilkan daftar yang sama untuk beberapa latihan terakhir. Hal ini memang dirancang demikian, untuk menunjukkan bahwa antarmuka Adapter
memungkinkan Anda merancang kode dengan berbagai cara. Makin kompleks kode Anda, makin penting untuk merancangnya dengan baik. Di aplikasi produksi, pola ini dan pola lainnya digunakan dengan RecyclerView
. Semua pola berfungsi, dan masing-masing memiliki manfaatnya. Pilihan yang Anda ambil bergantung pada apa yang Anda bangun.
Selamat! Pada tahap ini, Anda sudah hampir menguasai RecyclerView
di Android.
Project Android Studio: RecyclerViewDiffUtilDataBinding.
DiffUtil
:
RecyclerView
memiliki class bernamaDiffUtil
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 niat di Android Studio, letakkan kursor pada item kode apa pun dan tekan
Alt+Enter
(Option+Enter
di Mac). Menu ini sangat membantu untuk memfaktorkan ulang kode dan membuat stub untuk menerapkan metode. Menu ini 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 binding data menggunakannya. - Untuk mendeklarasikan adaptor binding, tentukan metode yang mengambil item dan tampilan, lalu anotasikan metode dengan
@BindingAdapter
. Di Kotlin, Anda dapat menulis adaptor binding sebagai fungsi ekstensi padaView
. Teruskan nama properti yang diadaptasi adaptor. Contoh:
@BindingAdapter("sleepDurationFormatted")
- Dalam tata letak XML, tetapkan properti
app
dengan nama yang sama dengan adaptor pengikatan. Teruskan variabel dengan data. Contoh:
.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. Instruktur menentukan hal berikut:
- Memberikan pekerjaan rumah jika diperlukan.
- Memberi tahu siswa cara mengirimkan tugas pekerjaan rumah.
- Memberi nilai tugas pekerjaan rumah.
Instruktur bisa menggunakan saran ini sesuai kebutuhan, dan bebas menugaskan pekerjaan rumah lain yang dirasa cocok.
Jika Anda menyelesaikan codelab ini sendiri, gunakan tugas pekerjaan rumah ini untuk menguji pengetahuan Anda.
Jawab pertanyaan-pertanyaan berikut
Pertanyaan 1
Manakah dari berikut ini 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 binding memungkinkan Anda memisahkan pemformatan data dari penampung tampilan.
▢ Anda harus menggunakan RecyclerViewAdapter
jika ingin menggunakan adaptor binding.
▢ Adaptor binding adalah solusi yang baik saat Anda perlu mengubah data yang kompleks.
Pertanyaan 3
Kapan sebaiknya Anda menggunakan Transformations
, bukan adaptor binding? Pilih semua yang sesuai.
▢ Data Anda sederhana.
▢ Anda sedang memformat string.
▢ Daftar Anda sangat panjang.
▢ ViewHolder
Anda hanya berisi satu tampilan.
Mulai pelajaran berikutnya: