Sobes.tech
Middle

Kā atrisināt problēmu ar dažādiem RecyclerView attēlojuma veidiem?

sobes.tech AI

Atbilde no AI

Ir vairākas pieejas:

  1. Izmantot vairākus ViewTypes adapterī. Tas ir visbiežāk un elastīgāk. Adapteris pārraksta metodi getItemViewType, kas atgriež konkrētā pozīcijas tipu. Tad šis tips tiek izmantots onCreateViewHolder un onBindViewHolder metodēs, lai izveidotu un sasaistītu atbilstošo ViewHolder.

    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("Nederīgs skata tips")
            }
        }
    
        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
        }
    
        // Dažādu tipu 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) {
                // Attēla ielāde
            }
        }
    }
    
    data class TextItem(val text: String)
    data class ImageItem(val imageUrl: String)
    
  2. Izmantot bibliotēkas. Pastāv bibliotēkas, kas atvieglo darbu ar vairākiem ViewTypes, piemēram, Groupie vai Epoxy. Tās nodrošina abstrakcijas items ar atbilstošiem ViewHolders un saistīšanas loģiku.

    • Groupie:

      class MyItemAdapter(private val items: List<GroupieItem<*>>) : GroupAdapter<ViewHolder>() {
          init {
              addAll(items)
          }
      }
      
      // Groupie Item piemērs
      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) {
             // Attēla ielāde
          }
      }
      
    • Epoxy: Izmanto anotācijas EpoxyModel un EpoxyController ģenerēšanai.

  3. Izmantot sarežģītus ViewHolders. Mazāk izplatīts pieejas veids, kad viens ViewHolder satur vairākus dažādus attēlojumus, un izvēle par redzamo attēlojumu tiek veikta ViewHolder iekšienē (caur setVisibility vai citām metodēm). Nav ieteicams lielam dažādu tipu skaitam vai sarežģītai loģikai.

  4. Datu sadalīšana. Ja datus var skaidri sadalīt grupās ar dažādiem attēlojumiem, var izmantot vairākus neatkarīgus RecyclerViews (kas bieži nav optimāli) vai komponentēt adapterus.