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

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 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 mentransformasi data.

Yang akan Anda lakukan

  • Buat 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 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.

  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 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 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 untuk tampilan recycler yang menampilkan data tersebut.
  • RecyclerView menggunakan SleepNightAdapter untuk menentukan jumlah item yang akan ditampilkan (getItemCount()). RecyclerView menggunakan onCreateViewHolder() dan onBindViewHolder() 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.

  1. Buka SleepNightAdapter.kt.
  2. Di bawah definisi class lengkap untuk SleepNightAdapter, buat class tingkat atas baru yang disebut SleepNightDiffCallback yang memperluas DiffUtil.ItemCallback. Teruskan SleepNight sebagai parameter generik.
class SleepNightDiffCallback : DiffUtil.ItemCallback<SleepNight>() {
}
  1. Letakkan kursor di nama class SleepNightDiffCallback.
  2. Tekan Alt+Enter (Option+Enter di Mac) dan pilih Implementasikan Anggota.
  3. Pada dialog yang terbuka, geser ke kiri-klik untuk memilih metode areItemsTheSame() dan areContentsTheSame(), lalu klik Oke.

    Tindakan ini akan menghasilkan stub di dalam SleepNightDiffCallback 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.
    }
  1. Di dalam areItemsTheSame(), ganti TODO dengan kode yang menguji apakah kedua item SleepNight yang diteruskan, oldItem dan newItem, sama. Jika item memiliki nightId yang sama, keduanya adalah item yang sama, jadi tampilkan true. Jika tidak, tampilkan false. 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
}
  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 akan memberi tahu DiffUtil 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

  1. Di 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 menggunakan ini untuk mencari tahu apa yang berubah dalam daftar. Tanda tangan class SleepNightAdapter Anda yang sudah selesai akan terlihat seperti yang ditunjukkan di bawah ini.
class SleepNightAdapter : ListAdapter<SleepNight, SleepNightAdapter.ViewHolder>(SleepNightDiffCallback()) {
  1. Di dalam class SleepNightAdapter, hapus kolom data, termasuk penyetel. Anda tidak membutuhkannya lagi, karena ListAdapter melacak daftar untuk Anda.
  2. Hapus penggantian getItemCount(), karena ListAdapter menerapkan 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 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.

  1. Buka SleepTrackerFragment.kt.
  2. Pada onCreateView(), dalam observer di sleepTrackerViewModel, temukan error yang merujuk ke variabel data yang telah Anda hapus.
  3. Ganti adapter.data = it dengan panggilan ke adapter.submitList(it). Kode yang diperbarui ditampilkan di bawah ini.

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 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

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

Langkah 2: Meng-inflate tata letak item menggunakan data binding

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

Kode yang akan dihapus:

val view = layoutInflater
       .inflate(R.layout.list_item_sleep_night, parent, false)
  1. Jika 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, tampilkan binding, bukan menampilkan view.
return ViewHolder(binding)
  1. Untuk mengatasi error, tempatkan kursor pada kata binding. Tekan Alt+Enter (Option+Enter di Mac) untuk membuka menu intent.
  1. Pilih Ubah parameter 'itemView' jenis konstruktor utama class 'ViewHolder' menjadi 'ListItemSleepNightBinding'. Ini akan memperbarui jenis parameter class ViewHolder.

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

    Pada definisi class ViewHolder, klik kanan pada salah satu kemunculan itemView, lalu pilih Refactor > Rename. Ubah nama menjadi binding.
  2. Awali parameter konstruktor binding dengan val 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 root ConstraintLayout dalam tata letak item Anda.
  4. 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().

  1. Ubah inisialisasi sleepLength, qualityString, dan qualityImage agar 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 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.

  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 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.

  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, jangan ubah kode; Anda memindahkannya pada langkah selanjutnya.)
  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 bagian isi setSleepDurationFormatted, ikat data ke tampilan seperti yang Anda lakukan di ViewHolder.bind(). Panggil convertDurationToFormatted(), lalu tetapkan text TextView ke teks berformat. (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, dan masukkan SleepNight.
  2. Di bagian isi, ikat data dengan tampilan seperti yang Anda lakukan di ViewHolder.bind(). Panggil convertNumericQualityToString dan setel text.
  3. Anotasi fungsi dengan @BindingAdapter("sleepQualityString").
@BindingAdapter("sleepQualityString")
fun TextView.setSleepQualityString(item: SleepNight) {
   text = convertNumericQualityToString(item.sleepQuality, context.resources)
}
  1. Adaptor binding ketiga menyetel gambar pada tampilan gambar. Buat fungsi ekstensi di ImageView, panggil setSleepImage, dan gunakan kode dari ViewHolder.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

  1. Buka SleepNightAdapter.kt.
  2. Hapus semuanya di metode bind() karena Anda sekarang dapat menggunakan data binding dan adaptor baru untuk melakukan ini untuk Anda.
fun bind(item: SleepNight) {
}
  1. Di dalam bind(), tetapkan tidur ke item, karena Anda perlu memberi tahu objek binding tentang SleepNight baru Anda.
binding.sleep = item
  1. Di bawah baris tersebut, tambahkan binding.executePendingBindings(). Panggilan ini adalah pengoptimalan yang meminta data binding untuk langsung mengeksekusi binding yang tertunda. Sebaiknya panggil executePendingBindings() saat Anda menggunakan adaptor binding di RecyclerView, karena dapat sedikit mempercepat 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 seperti adaptor binding yang menyetel gambar. Teruskan variabel sleep, seperti yang ditunjukkan di bawah ini.

    Properti ini membuat hubungan antara tampilan dan objek binding, melalui adaptor. Setiap kali sleepImage direferensikan, adaptor akan menyesuaikan 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. 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 disebut 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 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 di View. 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:

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