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
safeArgsuntuk meneruskan data antar-fragmen. - Melihat model, melihat factory model, transformasi, dan
LiveDataserta pengamatnya. - Cara membuat database
Room, membuat DAO, dan menentukan entity. - Cara menggunakan coroutine untuk database dan tugas berjalan lama lainnya.
- Cara menerapkan
RecyclerViewdasar denganAdapter,ViewHolder, dan tata letak item.
Yang akan Anda pelajari
- Cara menggunakan
DiffUtiluntuk memperbarui daftar yang ditampilkan olehRecyclerViewsecara 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
SleepNightAdapteruntuk 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
RecyclerViewdengan pola adapter untuk menampilkan data tidur kepada pengguna.

- Dari input pengguna, aplikasi membuat daftar objek
SleepNight. Setiap objekSleepNightmewakili satu malam tidur, durasi, dan kualitasnya. SleepNightAdaptermenyesuaikan daftar objekSleepNightmenjadi sesuatu yang dapat digunakan dan ditampilkan olehRecyclerView.- Adaptor
SleepNightAdaptermenghasilkanViewHoldersyang berisi tampilan, data, dan informasi meta agar tampilan recycler dapat menampilkan data. RecyclerViewmenggunakanSleepNightAdapteruntuk menentukan jumlah item yang akan ditampilkan (getItemCount()).RecyclerViewmenggunakanonCreateViewHolder()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 bernamaSleepNightDiffCallbackyang memperluasDiffUtil.ItemCallback. TeruskanSleepNightsebagai parameter generik.
class SleepNightDiffCallback : DiffUtil.ItemCallback<SleepNight>() {
}- Tempatkan kursor di nama class
SleepNightDiffCallback. - Tekan
Alt+Enter(Option+Enterdi 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 dalamSleepNightDiffCallbackuntuk kedua metode, seperti yang ditunjukkan di bawah.DiffUtilmenggunakan 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(), gantiTODOdengan kode yang menguji apakah dua itemSleepNightyang diteruskan,oldItemdannewItem, sama. Jika item memilikinightIdyang sama, item tersebut adalah item yang sama, jadi tampilkantrue. Jika tidak, tampilkanfalse.DiffUtilmenggunakan 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 apakaholdItemdannewItemberisi data yang sama; yaitu, apakah keduanya sama. Pemeriksaan kesetaraan ini akan memeriksa semua kolom, karenaSleepNightadalah class data. ClassDataotomatis menentukanequalsdan beberapa metode lainnya untuk Anda. Jika ada perbedaan antaraoldItemdannewItem, kode ini memberi tahuDiffUtilbahwa 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 classSleepNightAdapteruntuk memperluasListAdapter. - Jika diminta, impor
androidx.recyclerview.widget.ListAdapter. - Tambahkan
SleepNightsebagai argumen pertama keListAdapter, sebelumSleepNightAdapter.ViewHolder. - Tambahkan
SleepNightDiffCallback()sebagai parameter ke konstruktor.ListAdapterakan menggunakannya untuk mencari tahu apa yang berubah dalam daftar. Tanda tangan classSleepNightAdapteryang 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, karenaListAdaptermelacak daftar untuk Anda. - Hapus penggantian
getItemCount(), karenaListAdaptermengimplementasikan metode ini untuk Anda. - Untuk menghilangkan error di
onBindViewHolder(), ubah variabelitem. Daripada menggunakandatauntuk 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 variabeldatayang telah Anda hapus dirujuk. - Ganti
adapter.data = itdengan 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.xmldi tab Teks. - Letakkan kursor pada tag
ConstraintLayout, lalu tekanAlt+Enter(Option+Enterdi 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
typesebagai 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
viewberada, tentukan variabel baru bernamabindingyang 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+Enterdi 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
ViewHolderuntuk melihat perubahan pada tanda tangan. Anda akan melihat error untukitemView, karena Anda mengubahitemViewmenjadibindingdalam metodefrom().
Dalam definisi classViewHolder, klik kanan salah satu kemunculanitemView, lalu pilih Refactor > Rename. Ubah namanya menjadibinding. - Tambahkan awalan
valpada parameter konstruktorbindinguntuk menjadikannya properti. - Dalam panggilan ke class induk,
RecyclerView.ViewHolder, ubah parameter daribindingmenjadibinding.root. Anda harus meneruskanView, danbinding.rootadalahConstraintLayoutroot 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, danqualityImageuntuk 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.qualityImageDengan 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+Ndi 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 tetapkantextdariTextViewke 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 teruskansleepDurationFormattedsebagai 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(). PanggilconvertNumericQualityToStringdan 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 tentangSleepNightbaru.
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 propertiappdengan 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 kalisleepImagedirujuk, adaptor akan mengadaptasi data dariSleepNight.
app:sleepImage="@{sleep}"- Lakukan hal yang sama untuk tampilan teks
sleep_lengthdanquality_string. Setiap kalisleepDurationFormattedatausleepQualityStringdireferensikan, 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
ViewHolderdan 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:
RecyclerViewmemiliki class bernamaDiffUtilyang digunakan untuk menghitung perbedaan antara dua daftar.DiffUtilmemiliki class bernamaItemCallBackyang 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+Enterdi 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
Transformationsuntuk 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
appdengan nama yang sama dengan adaptor pengikatan. Teruskan variabel dengan data. Contoh:
.app:sleepDurationFormatted="@{sleep}"Kursus Udacity:
Dokumentasi developer Android:
- Membuat Daftar dengan RecyclerView
RecyclerViewDiffUtil- 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:

