RecyclerView uchun turli ko'rinish turlari bilan muammoni qanday hal qilish mumkin?
sobes.tech AI
AIdan javob
Bir nechta yondashuvlar mavjud:
-
Adapterda bir nechta ViewType ishlatish. Eng keng tarqalgan va moslashuvchan usul. Adapter
getItemViewTypemetodini qayta yozadi, u ma'lum bir pozitsiya uchun ko'rinish turini qaytaradi. So'ngra,onCreateViewHoldervaonBindViewHoldermetodlarida bu turdan foydalaniladi, mosViewHolderyaratiladi va bog'lanadi.class MyAdapter(private val items: List<Item>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { private val VIEW_TYPE_TEXT = 0 private val VIEW_TYPE_IMAGE = 1 override fun getItemViewType(position: Int): Int { return when (items[position]) { is TextItem -> VIEW_TYPE_TEXT is ImageItem -> VIEW_TYPE_IMAGE } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return when (viewType) { VIEW_TYPE_TEXT -> { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_text, parent, false) TextViewHolder(view) } VIEW_TYPE_IMAGE -> { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_image, parent, false) ImageViewHolder(view) } else -> throw IllegalArgumentException("Noto'g'ri ko'rinish turi") } } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder.itemViewType) { VIEW_TYPE_TEXT -> { val textHolder = holder as TextViewHolder val textItem = items[position] as TextItem textHolder.bind(textItem) } VIEW_TYPE_IMAGE -> { val imageHolder = holder as ImageViewHolder val imageItem = items[position] as ImageItem imageHolder.bind(imageItem) } } } override fun getItemCount(): Int { return items.size } // Turli turlar uchun ViewHolders class TextViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private val textView: TextView = itemView.findViewById(R.id.textView) fun bind(item: TextItem) { textView.text = item.text } } class ImageViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private val imageView: ImageView = itemView.findViewById(R.id.imageView) fun bind(item: ImageItem) { // Rasm yuklash } } } data class TextItem(val text: String) data class ImageItem(val imageUrl: String) -
Kutubxonalar yordamida. Bir nechta ViewType bilan ishlashni soddalashtiradigan kutubxonalar mavjud, masalan,
GroupieyokiEpoxy. Ularitemsni belgilash uchun abstraktsiyalarni taqdim etadi, ular bilan mos ViewHolders va bog'lash mantiqi.-
Groupie:
class MyItemAdapter(private val items: List<GroupieItem<*>>) : GroupAdapter<ViewHolder>() { init { addAll(items) } } // Groupie item misoli class TextItemGroupie(private val text: String) : Item<ViewHolder>() { override fun getLayout(): Int = R.layout.item_text override fun bind(viewHolder: ViewHolder, position: Int) { viewHolder.itemView.findViewById<TextView>(R.id.textView).text = text } } class ImageItemGroupie(private val imageUrl: String) : Item<ViewHolder>() { override fun getLayout(): Int = R.layout.item_image override fun bind(viewHolder: ViewHolder, position: Int) { // Rasm yuklash } } -
Epoxy: Anotatsiyalar yordamida
EpoxyModelvaEpoxyControlleryaratiladi.
-
-
Birlashgan ViewHolders ishlatish. Kamroq keng tarqalgan yondashuv, bunda bitta
ViewHolderbir nechta turli ko'rinishlarni o'z ichiga oladi va ko'rinish tanloviViewHolderichida amalga oshiriladi (setVisibilityyoki boshqa usullar bilan). Katta miqdordagi turli turlar yoki murakkab mantiq uchun tavsiya etilmaydi. -
Ma'lumotlarni ajratish. Agar ma'lumotlar aniq guruhlarga bo'linishi mumkin bo'lsa, bir nechta mustaqil
RecyclerView(bu ko'pincha optimal emas) yoki adapterlarning kompozitsiyasidan foydalanish mumkin.