Dasar-Dasar Android Kotlin 07.2: DiffUtil dan data binding dengan RecyclerView

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 dengan Adapter, ViewHolder, dan tata letak item.

Yang akan Anda pelajari

  • Cara menggunakan DiffUtil untuk memperbarui daftar yang ditampilkan oleh RecyclerView 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 menggunakan DiffUtil.
  • 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.

  1. Jika perlu, download aplikasi RecyclerViewDiffUtilDataBinding-Starter dari GitHub dan buka project di Android Studio.
  2. Jalankan aplikasi.
  3. Buka file SleepNightAdapter.kt.
  4. 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 objek SleepNight mewakili satu malam tidur, durasi, dan kualitasnya.
  • SleepNightAdapter menyesuaikan daftar objek SleepNight menjadi sesuatu yang dapat digunakan dan ditampilkan oleh RecyclerView.
  • Adaptor SleepNightAdapter menghasilkan ViewHolders yang berisi tampilan, data, dan informasi meta agar tampilan recycler dapat menampilkan data.
  • RecyclerView menggunakan SleepNightAdapter untuk menentukan jumlah item yang akan ditampilkan (getItemCount()). RecyclerView menggunakan onCreateViewHolder() dan onBindViewHolder() 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.

  1. Buka SleepNightAdapter.kt.
  2. Di bawah definisi class lengkap untuk SleepNightAdapter, buat class tingkat teratas baru bernama SleepNightDiffCallback yang memperluas DiffUtil.ItemCallback. Teruskan SleepNight sebagai parameter generik.
class SleepNightDiffCallback : DiffUtil.ItemCallback<SleepNight>() {
}
  1. Tempatkan kursor di nama class SleepNightDiffCallback.
  2. Tekan Alt+Enter (Option+Enter di Mac) dan pilih Terapkan Anggota.
  3. Pada dialog yang terbuka, klik kiri sambil menekan shift untuk memilih metode areItemsTheSame() dan areContentsTheSame(), lalu klik OK.

    Tindakan ini akan membuat stub di dalam SleepNightDiffCallback 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.
    }
  1. Di dalam areItemsTheSame(), ganti TODO dengan kode yang menguji apakah dua item SleepNight yang diteruskan, oldItem dan newItem, sama. Jika item memiliki nightId yang sama, item tersebut adalah item yang sama, jadi tampilkan true. Jika tidak, tampilkan false. 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
}
  1. Di dalam areContentsTheSame(), periksa apakah oldItem dan newItem berisi data yang sama; yaitu, apakah keduanya sama. Pemeriksaan kesetaraan ini akan memeriksa semua kolom, karena SleepNight adalah class data. Class Data otomatis menentukan equals dan beberapa metode lainnya untuk Anda. Jika ada perbedaan antara oldItem dan newItem, kode ini memberi tahu DiffUtil 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

  1. Dalam file SleepNightAdapter.kt, ubah tanda tangan class SleepNightAdapter untuk memperluas ListAdapter.
  2. Jika diminta, impor androidx.recyclerview.widget.ListAdapter.
  3. Tambahkan SleepNight sebagai argumen pertama ke ListAdapter, sebelum SleepNightAdapter.ViewHolder.
  4. Tambahkan SleepNightDiffCallback() sebagai parameter ke konstruktor. ListAdapter akan menggunakannya untuk mencari tahu apa yang berubah dalam daftar. Tanda tangan class SleepNightAdapter yang sudah selesai akan terlihat seperti yang ditunjukkan di bawah.
class SleepNightAdapter : ListAdapter<SleepNight, SleepNightAdapter.ViewHolder>(SleepNightDiffCallback()) {
  1. Di dalam class SleepNightAdapter, hapus kolom data, termasuk setter. Anda tidak memerlukannya lagi, karena ListAdapter melacak daftar untuk Anda.
  2. Hapus penggantian getItemCount(), karena ListAdapter mengimplementasikan metode ini untuk Anda.
  3. Untuk menghilangkan error di onBindViewHolder(), ubah variabel item. Daripada menggunakan data untuk mendapatkan item, panggil metode getItem(position) yang disediakan ListAdapter.
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.

  1. Buka SleepTrackerFragment.kt.
  2. Di onCreateView(), di pengamat pada sleepTrackerViewModel, temukan error tempat variabel data yang telah Anda hapus dirujuk.
  3. Ganti adapter.data = it dengan panggilan ke adapter.submitList(it). Kode yang diperbarui ditampilkan di bawah.

sleepTrackerViewModel.nights.observe(viewLifecycleOwner, Observer {
   it?.let {
       adapter.submitList(it)
   }
})
  1. 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

  1. Buka file tata letak list_item_sleep_night.xml di tab Teks.
  2. Letakkan kursor pada tag ConstraintLayout, lalu tekan Alt+Enter (Option+Enter di Mac). Menu niat (menu "perbaikan cepat") akan terbuka.
  3. Pilih Konversi ke tata letak data binding. Tindakan ini akan membungkus tata letak ke dalam <layout> dan menambahkan tag <data> di dalamnya.
  4. Scroll kembali ke bagian atas, jika perlu, dan di dalam tag <data>, deklarasikan variabel bernama sleep.
  5. Jadikan type sebagai nama yang sepenuhnya memenuhi syarat dari SleepNight, 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>
  1. 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 binding ListItemSleepNightBinding, beserta kode terkait, ditambahkan ke file yang dihasilkan project.

Langkah 2: Tampilkan tata letak item menggunakan data binding

  1. Buka SleepNightAdapter.kt.
  2. Di class ViewHolder, temukan metode from().
  3. Hapus deklarasi variabel view.

Kode untuk menghapus:

val view = layoutInflater
       .inflate(R.layout.list_item_sleep_night, parent, false)
  1. Di tempat variabel view berada, tentukan variabel baru bernama binding yang meng-inflate objek binding ListItemSleepNightBinding, seperti yang ditunjukkan di bawah. Lakukan impor objek binding yang diperlukan.
val binding =
ListItemSleepNightBinding.inflate(layoutInflater, parent, false)
  1. Di akhir fungsi, alih-alih menampilkan view, tampilkan binding.
return ViewHolder(binding)
  1. Untuk menghilangkan error, letakkan kursor Anda pada kata binding. Tekan Alt+Enter (Option+Enter di Mac) untuk membuka menu maksud.
  1. Pilih Ubah jenis parameter 'itemView' dari konstruktor utama class 'ViewHolder' menjadi 'ListItemSleepNightBinding'. Tindakan ini akan memperbarui jenis parameter class ViewHolder.

  1. Scroll ke atas ke definisi class ViewHolder untuk melihat perubahan pada tanda tangan. Anda akan melihat error untuk itemView, karena Anda mengubah itemView menjadi binding dalam metode from().

    Dalam definisi class ViewHolder, klik kanan salah satu kemunculan itemView, lalu pilih Refactor > Rename. Ubah namanya menjadi binding.
  2. Tambahkan awalan val pada parameter konstruktor binding untuk menjadikannya properti.
  3. Dalam panggilan ke class induk, RecyclerView.ViewHolder, ubah parameter dari binding menjadi binding.root. Anda harus meneruskan View, dan binding.root adalah ConstraintLayout root dalam tata letak item Anda.
  4. 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().

  1. Ubah inisialisasi sleepLength, qualityString, dan qualityImage untuk menggunakan tampilan objek binding, 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.

  1. Klik kanan nama properti sleepLength, quality, dan qualityImage. Pilih Refactor > Inline, atau tekan Control+Command+N (Option+Command+N di Mac).
  2. 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.

  1. Buka SleepNightAdapater.kt.
  2. Di dalam class ViewHolder, temukan metode bind() dan ingatkan diri Anda tentang fungsi metode ini. Anda akan mengambil kode yang menghitung nilai untuk binding.sleepLength, binding.quality, dan binding.qualityImage, lalu menggunakannya di dalam adaptor. (Untuk saat ini, biarkan kode apa adanya; Anda akan memindahkannya pada langkah berikutnya.)
  3. Dalam paket sleeptracker, buat dan buka file bernama BindingUtils.kt.
  4. Deklarasikan fungsi ekstensi di TextView, yang disebut setSleepDurationFormatted, dan teruskan SleepNight. Fungsi ini akan menjadi adaptor Anda untuk menghitung dan memformat durasi tidur.
fun TextView.setSleepDurationFormatted(item: SleepNight) {}
  1. Di isi setSleepDurationFormatted, ikat data ke tampilan seperti yang Anda lakukan di ViewHolder.bind(). Panggil convertDurationToFormatted(), lalu tetapkan text dari TextView ke teks yang diformat. (Karena ini adalah fungsi ekstensi pada TextView, Anda dapat langsung mengakses properti text.)
text = convertDurationToFormatted(item.startTimeMilli, item.endTimeMilli, context.resources)
  1. Untuk memberi tahu data binding tentang adaptor binding ini, anotasikan fungsi dengan @BindingAdapter.
  2. Fungsi ini adalah adaptor untuk atribut sleepDurationFormatted, jadi teruskan sleepDurationFormatted sebagai argumen ke @BindingAdapter.
@BindingAdapter("sleepDurationFormatted")
  1. Adaptor kedua menetapkan kualitas tidur berdasarkan nilai dalam objek SleepNight. Buat fungsi ekstensi bernama setSleepQualityString() di TextView, lalu teruskan SleepNight.
  2. Di isi, ikat data ke tampilan seperti yang Anda lakukan di ViewHolder.bind(). Panggil convertNumericQualityToString dan tetapkan text.
  3. Anotasi fungsi dengan @BindingAdapter("sleepQualityString").
@BindingAdapter("sleepQualityString")
fun TextView.setSleepQualityString(item: SleepNight) {
   text = convertNumericQualityToString(item.sleepQuality, context.resources)
}
  1. Adaptor binding ketiga menetapkan gambar pada tampilan gambar. Buat fungsi ekstensi di ImageView, panggil setSleepImage, dan gunakan kode dari ViewHolder.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

  1. Buka SleepNightAdapter.kt.
  2. Hapus semuanya dalam metode bind(), karena Anda kini dapat menggunakan pengikatan data dan adaptor baru untuk melakukan pekerjaan ini.
fun bind(item: SleepNight) {
}
  1. Di dalam bind(), tetapkan sleep ke item, karena Anda perlu memberi tahu objek pengikatan tentang SleepNight baru.
binding.sleep = item
  1. Di bawah baris tersebut, tambahkan binding.executePendingBindings(). Panggilan ini adalah pengoptimalan yang meminta data binding untuk segera menjalankan binding yang tertunda. Sebaiknya panggil executePendingBindings() saat Anda menggunakan adaptor binding dalam RecyclerView, karena dapat sedikit mempercepat penentuan ukuran tampilan.
 binding.executePendingBindings()

Langkah 3: Tambahkan binding ke tata letak XML

  1. Buka list_item_sleep_night.xml.
  2. Di ImageView, tambahkan properti app dengan nama yang sama dengan adaptor binding yang menyetel gambar. Teruskan variabel sleep, seperti yang ditunjukkan di bawah.

    Properti ini membuat koneksi antara tampilan dan objek binding, melalui adaptor. Setiap kali sleepImage dirujuk, adaptor akan mengadaptasi data dari SleepNight.
app:sleepImage="@{sleep}"
  1. Lakukan hal yang sama untuk tampilan teks sleep_length dan quality_string. Setiap kali sleepDurationFormatted atau sleepQualityString direferensikan, adaptor akan menyesuaikan data dari SleepNight.
app:sleepDurationFormatted="@{sleep}"
app:sleepQualityString="@{sleep}"
  1. 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 bernama DiffUtil yang digunakan untuk menghitung perbedaan antara dua daftar.
  • DiffUtil memiliki class bernama ItemCallBack yang Anda perluas untuk mengetahui perbedaan antara dua daftar.
  • Di class ItemCallback, Anda harus mengganti metode areItemsTheSame() dan areContentsTheSame().

ListAdapter:

  • Untuk mendapatkan beberapa pengelolaan daftar secara gratis, Anda dapat menggunakan class ListAdapter, bukan RecyclerView.Adapter. Namun, jika menggunakan ListAdapter, 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 pada View. 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:

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: 7.3: GridLayout dengan RecyclerView