Как использовать ViewBinding в RecyclerView.Adapter? - PullRequest
3 голосов
/ 27 февраля 2020

Могу ли я использовать ViewBindings для замены findViewById в этом типичном RecyclerView.Adapter коде инициализации? Я не могу установить значение binding в объекте, так как ViewHolders отличаются для каждой ячейки.

class CardListAdapter(private val cards: LiveData<List<Card>>) : RecyclerView.Adapter<CardListAdapter.CardViewHolder>() {

    class CardViewHolder(val cardView: View) : RecyclerView.ViewHolder(cardView)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardViewHolder {
        val binding = CardBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return CardViewHolder(binding.root)
    }

    override fun onBindViewHolder(holder: CardViewHolder, position: Int) {
        val title = holder.cardView.findViewById<TextView>(R.id.title)
        val description = holder.cardView.findViewById<TextView>(R.id.description)
        val value = holder.cardView.findViewById<TextView>(R.id.value)
        // ...
    }

Ответы [ 4 ]

7 голосов
/ 27 февраля 2020

Что вам нужно сделать, это передать созданный объект класса привязки в конструктор класса держателя. В приведенном ниже примере у меня есть файл row_payment XML для элемента RecyclerView, а сгенерированный класс - RowPaymentBinding, так что

class PaymentAdapter(private val paymentList: List<PaymentBean>) : RecyclerView.Adapter<PaymentAdapter.PaymentHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PaymentHolder {
        val itemBinding = RowPaymentBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return PaymentHolder(itemBinding)
    }

    override fun onBindViewHolder(holder: PaymentHolder, position: Int) {
        val paymentBean: PaymentBean = paymentList[position]
        holder.bind(paymentBean)
    }

    override fun getItemCount(): Int = paymentList.size

    class PaymentHolder(private val itemBinding: RowPaymentBinding) : RecyclerView.ViewHolder(itemBinding.root) {
        fun bind(paymentBean: PaymentBean) {
            itemBinding.tvPaymentInvoiceNumber.text = paymentBean.invoiceNumber
            itemBinding.tvPaymentAmount.text = paymentBean.totalAmount
        }
    }
}

Кроме того, убедитесь, что вы передаете представление root родительский класс держателя вида, подобный этому * RecyclerView.ViewHolder(itemBinding.root) *, получая доступ к переданному объекту класса привязки.

0 голосов
/ 27 февраля 2020

просто передайте калибровку вашей модели в xml и установите эти данные в xml этот код выглядит отлично и добавьте метод, в котором вы добавляете эти данные в привязку, как вы не нуждаетесь, для этого

необходимо указать точный идентификатор
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.setData(listData[position])

}


fun setData(model: ListData) {
        with(binding) {
            data = model
            executePendingBindings()
        }
    }
0 голосов
/ 27 февраля 2020

Вы можете использовать привязку данных следующим образом.

class CardListAdapter(
        private val mActivity: FragmentActivity?
    ) :
        RecyclerView.Adapter<RecyclerView.ViewHolder>() {
         private var mCustomLayoutBinding: CustomLayoutBinding? = null

          inner class MyViewHolder(val mBinding: CustomLayoutBinding) :
            RecyclerView.ViewHolder(mBinding.getRoot())
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
            if (layoutInflater == null)
                layoutInflater = LayoutInflater.from(parent.context)

            var viewHolder: RecyclerView.ViewHolder? = null
            val inflater = LayoutInflater.from(parent.context)

       viewHolder = getViewHolder(parent, inflater)
                 return viewHolder!!
            }
            private fun getViewHolder(
            parent: ViewGroup,
            inflater: LayoutInflater
        ): RecyclerView.ViewHolder {
            mCustomLayoutBinding =
                DataBindingUtil.inflate(inflater, R.layout.custom_layout, parent, false)
            return MyViewHolder(this!!.mAssistanceLogCustomLayoutBinding!!)
        }
          override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
            val taskModal = mArrayList.get(position)
             holder.mBinding.txtTitle.setText(taskModal.title)
              }
              override fun getItemCount(): Int {
            return assistanceArrayList.size
        }

        override fun getItemId(position: Int): Long {
            return position.toLong()
        }

        override fun getItemViewType(position: Int): Int {
            return position
        }
        }
0 голосов
/ 27 февраля 2020

Я нашел два варианта:

Использовать метод bind в классе привязки

override fun onBindViewHolder(holder: CardViewHolder, position: Int) {
        val binding = CardBinding.bind(holder.cardView)
        // binding.title ...

Или присоединить binding к ViewHolder вместо View

    class CardViewHolder(val binding: CardBinding) : RecyclerView.ViewHolder(binding.root)

Затем доступ с помощью:

    holder.binding.title
...