Saya mencoba untuk bekerja dengan yang baru RecyclerView
, tetapi saya tidak dapat menemukan contoh RecyclerView
dengan berbagai jenis baris / tampilan kartu yang meningkat.
Dengan ListView
saya menimpa getViewTypeCount
dan getItemViewType
, untuk menangani berbagai jenis baris.
Apakah saya seharusnya melakukannya dengan cara "lama" atau haruskah saya melakukan sesuatu dengannya LayoutManager
? Saya bertanya-tanya apakah seseorang bisa mengarahkan saya ke arah yang benar. Karena saya hanya dapat menemukan contoh dengan satu jenis.
Saya ingin memiliki daftar kartu yang sedikit berbeda. Atau haruskah saya hanya menggunakan scrollView
dengan cardViews
di dalamnya ... membuatnya tanpa adaptor dan recyclerView
?
Jawaban:
Menangani logika baris / bagian yang mirip dengan UITableView di iOS tidak sesederhana di Android seperti di iOS, namun, ketika Anda menggunakan RecyclerView - fleksibilitas yang dapat Anda lakukan jauh lebih besar.
Pada akhirnya, ini semua tentang bagaimana Anda mengetahui jenis tampilan yang Anda tampilkan di Adaptor. Setelah Anda mengetahuinya, itu harus mudah berlayar (tidak juga, tapi setidaknya Anda akan memiliki yang diurutkan).
Adaptor memaparkan dua metode yang harus Anda timpa:
Implementasi default metode ini akan selalu menghasilkan 0, menunjukkan bahwa hanya ada 1 jenis tampilan. Dalam kasus Anda, tidak demikian halnya, dan Anda perlu menemukan cara untuk menegaskan baris mana yang sesuai dengan tipe tampilan mana. Tidak seperti iOS, yang mengelola ini untuk Anda dengan baris dan bagian, di sini Anda hanya akan memiliki satu indeks untuk diandalkan, dan Anda harus menggunakan keterampilan pengembang Anda untuk mengetahui kapan posisi berkorelasi dengan header bagian, dan kapan itu berkorelasi dengan baris normal.
Anda perlu mengganti metode ini, tetapi biasanya orang mengabaikan parameter viewType. Menurut jenis tampilan, Anda harus mengembang sumber daya tata letak yang benar dan membuat pemegang tampilan Anda sesuai. RecyclerView akan menangani daur ulang berbagai jenis tampilan dengan cara yang menghindari bentrok dari berbagai jenis tampilan.
Jika Anda berencana menggunakan LayoutManager default, seperti
LinearLayoutManager
, Anda sebaiknya melakukannya. Jika Anda berencana membuat implementasi LayoutManager Anda sendiri, Anda harus bekerja sedikit lebih keras. Satu-satunya API yang benar-benar harus Anda kerjakan adalahfindViewByPosition(int position)
yang memberikan tampilan tertentu pada posisi tertentu. Karena Anda mungkin ingin meletakkannya secara berbeda tergantung pada jenis tampilan ini, Anda memiliki beberapa opsi:Biasanya saat menggunakan pola ViewHolder, Anda mengatur tag view dengan view view. Anda bisa menggunakan ini selama runtime di manajer tata letak untuk mengetahui apa jenis tampilan dengan menambahkan bidang di tempat tampilan yang mengekspresikan ini.
Karena Anda akan memerlukan fungsi yang menentukan posisi mana yang berkorelasi dengan tipe tampilan mana, Anda mungkin juga membuat metode ini dapat diakses secara global (mungkin kelas tunggal yang mengelola data?), Dan kemudian Anda dapat dengan mudah menanyakan metode yang sama sesuai dengan Posisinya.
Berikut ini contoh kode:
Berikut ini contoh tampilan pemegang tampilan:
Tentu saja, sampel ini mengasumsikan Anda telah membangun sumber data Anda (myData) dengan cara yang membuatnya mudah untuk mengimplementasikan adaptor dengan cara ini. Sebagai contoh, saya akan menunjukkan kepada Anda bagaimana saya akan membangun sumber data yang menunjukkan daftar nama, dan header untuk setiap kali huruf pertama dari nama tersebut berubah (anggaplah daftar itu disusun menurut abjad) - mirip dengan cara kontak daftar akan terlihat seperti:
Contoh ini datang untuk menyelesaikan masalah yang cukup spesifik, tetapi saya harap ini memberi Anda tinjauan yang baik tentang bagaimana menangani jenis baris yang berbeda dalam pendaur ulang, dan memungkinkan Anda membuat adaptasi yang diperlukan dalam kode Anda sendiri agar sesuai dengan kebutuhan Anda.
sumber
names[i].substring(0, 1)
onCreateViewHolder
yang membantu kami membuat view view. Untuk detail lebih lanjut Anda mungkin ingin memeriksa bagian saya: stackoverflow.com/questions/47245398/…Caranya adalah dengan membuat subclass dari ViewHolder dan kemudian melemparkannya.
Dan kemudian, saat runtime lakukan sesuatu seperti ini:
Semoga ini bisa membantu.
sumber
Menurut Gil jawaban hebat yang saya pecahkan dengan Mengganti getItemViewType seperti yang dijelaskan oleh Gil. Jawabannya bagus dan harus ditandai sebagai benar. Bagaimanapun, saya menambahkan kode untuk mencapai skor:
Di adaptor pendaur ulang Anda:
Dengan melakukan ini, Anda dapat mengatur tata letak khusus apa pun untuk baris apa pun!
sumber
Ini cukup rumit tetapi sulit, cukup salin kode di bawah ini dan Anda selesai
Nikmati !!!!
sumber
Kami dapat mencapai beberapa tampilan pada RecyclerView tunggal dari cara berikut: -
Ketergantungan pada Gradle jadi tambahkan kode di bawah ini: -
RecyclerView dalam XML
Kode Kegiatan
XML pertama
XML kedua
XML ketiga
Sekarang saatnya membuat adaptor dan ini adalah utama untuk menampilkan tampilan -2 berbeda pada tampilan pendaur ulang yang sama jadi silakan periksa fokus kode ini sepenuhnya: -
Anda juga dapat memeriksa tautan ini untuk informasi lebih lanjut.
sumber
Anda harus menerapkan
getItemViewType()
metode dalamRecyclerView.Adapter
. Secara defaultonCreateViewHolder(ViewGroup parent, int viewType)
implementasiviewType
metode ini kembali0
. Pertama, Anda perlu melihat jenis item pada posisi untuk keperluan daur ulang tampilan dan untuk itu Anda harus menggantigetItemViewType()
metode yang dapat Anda lewativiewType
yang akan mengembalikan posisi item Anda. Contoh kode diberikan di bawah inisumber
getItemViewType (posisi int) adalah kuncinya
Bagaimana cara melakukannya ?
Anda dapat membuat
RecyclerView
dengan sejumlah Tampilan yang berbeda (ViewHolders). Tetapi untuk keterbacaan yang lebih baik mari kita ambil contohRecyclerView
dengan duaViewholders
.Ingat 3 langkah sederhana ini dan Anda akan baik untuk pergi.
getItemViewType(int position)
ViewType
onCreateViewHolder ()Populate View berdasarkan pada itemViewType dalam
onBindViewHolder()
metodeIni cuplikan kode untuk Anda
Kode GitHub:
Ini adalah proyek di mana saya telah menerapkan RecyclerView dengan beberapa ViewHolders.
sumber
Anda bisa mengembalikan ItemViewType dan menggunakannya. Lihat kode di bawah ini:
sumber
Anda dapat menggunakan perpustakaan: https://github.com/vivchar/RendererRecyclerViewAdapter
Untuk setiap item, Anda harus menerapkan ViewRenderer, ViewHolder, SomeModel:
ViewHolder - ini adalah pemegang tampilan sederhana dari pendaur ulang.
SomeModel - ini adalah model Anda dengan
ItemModel
antarmukaUntuk lebih jelasnya Anda bisa melihat dokumentasi.
sumber
Anda dapat menggunakan perpustakaan ini:
https://github.com/kmfish/MultiTypeListViewAdapter (ditulis oleh saya)
Adaptor pemasangan:
Untuk setiap item baris:
sumber