Sobes.tech
Middle

RecyclerView için farklı görünüm türleriyle ilgili sorunu nasıl çözebilirsiniz?

sobes.tech yapay zeka

AI'dan gelen yanıt

Birkaç yaklaşım vardır:

  1. Adaptörde birden fazla ViewType kullanımı. En yaygın ve esnek yöntemdir. Adaptör, belirli bir pozisyon için görünüm türünü döndüren getItemViewType metodunu geçersiz kılar. Daha sonra, onCreateViewHolder ve onBindViewHolder metodlarında bu tür kullanılarak uygun ViewHolder oluşturulur ve bağlanır.

    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("Geçersiz görünüm türü")
            }
        }
    
        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
        }
    
        // Farklı türler için 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) {
                // Resim yükleme
            }
        }
    }
    
    data class TextItem(val text: String)
    data class ImageItem(val imageUrl: String)
    
  2. Kütüphanelerin kullanımı. Çoklu ViewType ile çalışmayı kolaylaştıran kütüphaneler vardır, örneğin Groupie veya Epoxy. Bunlar, ilgili ViewHolders ve bağlama mantığıyla "öğeleri" tanımlamak için soyutlamalar sağlar.

    • Groupie:

      class MyItemAdapter(private val items: List<GroupieItem<*>>) : GroupAdapter<ViewHolder>() {
          init {
              addAll(items)
          }
      }
      
      // Bir Groupie Öğesi örneği
      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) {
             // Resim yükleme
          }
      }
      
    • Epoxy: Anotasyonlar kullanılarak EpoxyModel ve EpoxyController oluşturulur.

  3. Bileşik ViewHolders kullanımı. Daha az yaygın olan bu yaklaşımda, bir ViewHolder birkaç farklı görünüm içerir ve görünüm seçimi ViewHolder içinde yapılır (setVisibility veya diğer yöntemlerle). Çok sayıda farklı tür veya karmaşık mantık için önerilmez.

  4. Veri ayrımı. Veriler, farklı görünümlerle net bir şekilde bölünebiliyorsa, birkaç bağımsız RecyclerView (bu genellikle optimal değildir) veya adaptörlerin bileşimi kullanılabilir.