Sobes.tech
Middle

როგორ შეიძლება გადაწყდეს RecyclerView-ის სხვადასხვა ტიპის ჩვენებების პრობლემა?

sobes.tech AI

პასუხი AI-სგან

მრავალი მიდგომაა:

  1. მრავალი ViewTypes-ის გამოყენება ადაპტერის ფარგლებში. ეს ყველაზე გავრცელებული და მოქნილი მეთოდია. ადაპტერი გადაწერს მეთოდს getItemViewType, რომელიც აბრუნებს კონკრეტული პოზიციის ტიპს. შემდეგ ამ ტიპს იყენებენ onCreateViewHolder და onBindViewHolder მეთოდებში შესაბამისი 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("არასწორი ხედი ტიპი")
            }
        }
    
        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
        }
    
        // სხვადასხვა ტიპების 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) {
                // სურათის ჩატვირთვა
            }
        }
    }
    
    data class TextItem(val text: String)
    data class ImageItem(val imageUrl: String)
    
  2. ბიბლიოთეკების გამოყენება. არსებობს ბიბლიოთეკები, რომლებიც ამარტივებს მრავალ ViewTypes-ის მუშაობას, მაგალითად, Groupie ან Epoxy. ისინი უზრუნველყოფენ აბსტრაქციებს items-ებისთვის შესაბამისი ViewHolders და ბმულის ლოგიკის განსაზღვრაში.

    • Groupie:

      class MyItemAdapter(private val items: List<GroupieItem<*>>) : GroupAdapter<ViewHolder>() {
          init {
              addAll(items)
          }
      }
      
      // Groupie Item-ის მაგალითი
      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) {
             // სურათის ჩატვირთვა
          }
      }
      
    • Epoxy: იყენებს ანოტაციებს EpoxyModel და EpoxyController-ის გენერაციისთვის.

  3. კომპოზიციური ViewHolders-ის გამოყენება. ნაკლებად გავრცელებული მიდგომაა, როდესაც ერთი ViewHolder შეიცავს რამდენიმე სხვადასხვა წარმოდგენას და არჩევანი კეთდება ViewHolder-ის შიგნით (მეშვეობით setVisibility ან სხვა მეთოდებით). არ არის რეკომენდებული დიდი რაოდენობის სხვადასხვა ტიპებისთვის ან რთული ლოგიკისთვის.

  4. მონაცემების განაწილება. თუ მონაცემებს შეიძლება მკაფიოდ დაყოფა ჯგუფებად სხვადასხვა წარმოდგენებით, შეიძლება გამოიყენოთ რამდენიმე დამოუკიდებელი RecyclerViews (რაც ხშირად არ არის ოპტიმალური) ან ადაპტერების კომპოზიცია.