MergeAdapter adalah kelas baru yang diperkenalkan di recyclerview: 1.2.0-alpha02 yang memungkinkan Anda menggabungkan beberapa adaptor tampilan ke dalam satu RecyclerView. Ini akan memungkinkan Anda merangkum logika untuk setiap sel di adaptor Anda, dan memungkinkan Anda untuk menggunakannya kembali di masa mendatang.
Masalah
Mari kita mulai dengan sebuah contoh. Misalkan kita memiliki tugas untuk menampilkan feed dengan dua jenis data - teks dengan deskripsi dan gambar. Kode metode
onCreateViewHolder dalam kasus yang paling umum akan terlihat seperti ini:
override fun onCreateViewHolder(
parent: ViewGroup, viewType: Int
): RecyclerView.ViewHolder? {
val holder: RecyclerView.ViewHolder
val inflater = LayoutInflater.from(parent.context)
when (viewType) {
TEXT_VIEW_TYPE -> {
holder = TextViewHolder(
inflater.inflate(R.layout.text_item, parent, false)
)
}
IMAGE_VIEW_TYPE -> {
holder = ImageViewHolder(
inflater.inflate(R.layout.image_item, parent, false),
imageClickListener
)
}
else -> {
throw IllegalArgumentException(
"Can't create view holder from view type $viewType"
)
}
}
return holder
}
Mengapa itu buruk? Kerugian dari penerapan ini adalah melanggar prinsip KERING dan PADAT (tanggung tunggal dan tertutup terbuka). Untuk meyakinkan hal ini, cukup dengan menambahkan dua persyaratan: masukkan tipe data baru (kotak centang) dan pita lain, di mana hanya akan ada kotak centang dan gambar.
Kami dihadapkan pada pilihan - menggunakan adaptor yang sama untuk rekaman kedua atau membuat yang baru? Terlepas dari solusi yang kami pilih, kami harus mengubah kode (tentang hal yang sama, tetapi di tempat yang berbeda). Ini akan diperlukan untuk menambahkan VIEW_TYPE baru, ViewHolder baru dan mengedit metode:
getItemViewType(), onCreateViewHolder() onBindViewHolder().
Jika kami memutuskan untuk menyimpan satu adaptor, maka perubahan akan berakhir di sana. Tetapi jika di masa mendatang tipe data baru dengan logika baru hanya ditambahkan ke feed kedua, yang pertama akan memiliki fungsi tambahan, dan juga perlu diuji, meskipun tidak berubah.
Jika kami memutuskan untuk membuat adaptor baru, hanya akan ada banyak kode duplikat.
Keputusan
Kelas MergeAdapter yang baru memungkinkan Anda menggabungkan adaptor yang berbeda untuk berbagai jenis sel. Misalnya, kasus penggunaan yang sangat umum adalah menampilkan spinner saat memuat data dalam umpan, dan jika, tiba-tiba, terjadi kesalahan pemuatan, tampilkan sel dengan kesalahan di akhir umpan.
Solusi untuk masalah ini dapat menggunakan MergeAdapter Misalkan kita memiliki 3 adaptor:
val firstAdapter: FirstAdapter = …
val secondAdapter: SecondAdapter = …
val thirdAdapter: ThirdAdapter = …val mergeAdapter = MergeAdapter(firstAdapter, secondAdapter, thirdAdapter)
recyclerView.adapter = mergeAdapter
RecyclerView akan menampilkan item dari setiap adaptor secara berurutan, dengan urutan yang sama saat diteruskan ke konstruktor. Adaptor berbeda memungkinkan Anda memisahkan logika untuk sel yang berbeda dalam daftar. Misalnya, jika Anda perlu menambahkan judul ke daftar, Anda tidak perlu menerapkan logika ini di adaptor, yang bertanggung jawab untuk menampilkan konten utama dalam daftar, Anda dapat memisahkan adaptor untuk berbagai jenis sel. Pendekatan ini membantu merangkum logika dan menggunakannya kembali di masa mendatang untuk layar yang berbeda.
Tampilkan unduhan di tajuk atau di bagian bawah daftar.
Untuk menampilkan status unduhan di bagian atas atau bawah daftar, Anda perlu menambahkan adaptor, masing-masing:
val mergeAdapter = MergeAdapter(headerAdapter, listAdapter, footerAdapter)
recyclerView.adapter = mergeAdapter
Sel atas dan bawah menggunakan tata letak, ViewHolder, dan logika UI yang sama (tampilkan status pemuatan dan sembunyikan). Secara umum, itu akan cukup untuk menggunakan 2 contoh dari adaptor yang sama untuk bagian atas dan bawah daftar. Contohnya dapat ditemukan di sini atau di sini .
Singkatnya, dengan cara yang sederhana Anda dapat meningkatkan kode proyek Anda jika Anda menggunakan adaptor yang kompleks dengan berbagai jenis sel.
Apakah Anda menyukai artikelnya? Jangan lupa untuk bergabung dengan kami di Telegram , dan di platform AndroidSchool.ru materi yang berguna untuk pengembang Android dan tutorial modern diterbitkan.