Sobes.tech
Middle

RecyclerView üçün müxtəlif görünüş növləri ilə bağlı problemi necə həll etmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

Müxtəlif yanaşmalar mövcuddur:

  1. Adapterdə çoxlu ViewType istifadə etmək. Bu ən yaygın və çevik yoldur. Adapter getItemViewType metodunu yenidən yazar və bu metod müəyyən mövqeyə görə görünüş növünü qaytarır. Sonra bu növ onCreateViewHolderonBindViewHolder metodlarında istifadə olunur ki, uyğun ViewHolder yaradılıb və bağlansın.

    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("Yanlış görünüş növü")
            }
        }
    
        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
        }
    
        // Müxtəlif növ 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) {
                // Şəkil yükləmə
            }
        }
    }
    
    data class TextItem(val text: String)
    data class ImageItem(val imageUrl: String)
    
  2. Kitabxanalardan istifadə. Groupie və ya Epoxy kimi çoxlu ViewType ilə işləməyi asanlaşdıran kitabxanalar mövcuddur. Bu kitablar uyğun items və ViewHolders üçün abstraksiyalar təqdim edir və bağlama loqikasını sadələşdirir.

    • Groupie:

      class MyItemAdapter(private val items: List<GroupieItem<*>>) : GroupAdapter<ViewHolder>() {
          init {
              addAll(items)
          }
      }
      
      // Groupie Item nümunəsi
      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) {
             // Şəkil yükləmə
          }
      }
      
    • Epoxy: Anotasiya istifadə edərək EpoxyModelEpoxyController yaradır.

  3. Birləşmiş ViewHolders istifadə etmək. Bu daha az yayılmış yanaşmadır və bir ViewHolder-in müxtəlif görünüşləri ehtiva etdiyi və görünən görünüşün ViewHolder daxilində seçildiyi (məsələn, setVisibility və ya digər üsullarla) yanaşmadır. Bu, çox sayda müxtəlif növ və ya mürəkkəb loqika üçün tövsiyə edilmir.

  4. Məlumatların bölünməsi. Əgər məlumatlar aydın şəkildə müxtəlif görünüşlərlə qruplaşdırıla bilərsə, bir neçə müstəqil RecyclerView və ya adapterlərin kompozisiyasını istifadə etmək olar.