Android: значения не присваиваются при использовании привязки данных в моем пользовательском адаптере

#android #kotlin #android-recyclerview #android-databinding

#Android #kotlin #android-recyclerview #android-привязка к данным

Вопрос:

Я пытаюсь передать свою переменную привязки для адаптера ViewHolder для определения значений для textviews в моем адаптере, но значения не присваиваются, и прослушиватели щелчков ничего не делают.

Вот мой класс адаптера:

 class DoneAppointmentsAdapter(var context: DoneAppointmentsFragment, listener: ContentListener, var arrayList: List<Appointment>) :
    RecyclerView.Adapter<DoneAppointmentsAdapter.ItemHolder>() {

    private val listener: ContentListener = listener
    private var binding: DoneAppointmentsAdapterBinding? = null

    var activity = context
    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): ItemHolder {
        val viewHolder = LayoutInflater.from(parent.context)
            .inflate(R.layout.done_appointments_adapter, parent, false)
        binding = DoneAppointmentsAdapterBinding.inflate(LayoutInflater.from(parent.context))
        return ItemHolder(viewHolder,binding, parent.context)
    }

    override fun onBindViewHolder(holder: ItemHolder, position: Int) {
        holder.bind(arrayList, listener)
    }

    override fun getItemCount(): Int {
        return arrayList.size
    }

    class ItemHolder(view: View, var binding: DoneAppointmentsAdapterBinding?, val context: Context) : RecyclerView.ViewHolder(view) {

        fun bind(listOfData: List<Appointment>, listener: ContentListener) {
            val dataListItem = listOfData[adapterPosition]

            binding?.donePatientItemName?.text = "${dataListItem.patientName}"
            binding?.donePatientItemTime?.text = "Some date"

            binding?.donePatientItemPatientInfo?.setOnClickListener {
                tempAppointmentId = dataListItem.id
                listener.onPatientHistoryViewClicked(dataListItem.requestedBy)
            }

            binding?.donePatientItemReviewCase?.setOnClickListener {
                amendPrescriptionWarning(dataListItem,context)
            }

            binding.donePatientItemViewCase.setOnClickListener {
                startPreview(dataListItem)
            }
        }
    }
}
 

Комментарии:

1. Я не уверен, что использую правильный шаблон для работы с привязкой данных и адаптерами. Любая помощь приветствуется

Ответ №1:

Вы перепутались внутри onCreateViewHolder . вы создали представление дважды, один раз с LayoutInflater.from(parent.context) помощью и один раз с DoneAppointmentsAdapterBinding.inflate помощью . В этом случае должен быть только один DoneAppointmentsAdapterBinding .

 class DoneAppointmentsAdapter(var context: DoneAppointmentsFragment, listener: ContentListener, var arrayList: List<Appointment>) :
    RecyclerView.Adapter<DoneAppointmentsAdapter.ItemHolder>() {
    private val listener: ContentListener = listener

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): ItemHolder {
        val binding = DoneAppointmentsAdapterBinding.inflate(LayoutInflater.from(parent.context))
        return ItemHolder(binding)
    }

    override fun onBindViewHolder(holder: ItemHolder, position: Int) {
        holder.bind(arrayList, listener)
    }

    override fun getItemCount(): Int {
        return arrayList.size
    }

    class ItemHolder (var binding: DoneAppointmentsAdapterBinding) : RecyclerView.ViewHolder(binding.root) {
        fun bind(listOfData: List<Appointment>, listener: ContentListener) {
            val dataListItem = listOfData[adapterPosition]
            binding.donePatientItemName.text = "${dataListItem.patientName}"
            binding.donePatientItemTime.text = "Some date"
            binding.donePatientItemPatientInfo.setOnClickListener {
                tempAppointmentId = dataListItem.id
                listener.onPatientHistoryViewClicked(dataListItem.requestedBy)
            }
            binding.donePatientItemReviewCase.setOnClickListener {
                amendPrescriptionWarning(dataListItem,binding.donePatientItemReviewCase.context)
            }
            binding.donePatientItemViewCase.setOnClickListener {
                startPreview(dataListItem)
            }
        }
    }
}
 

Это должно быть так. Я также удалил дополнительные бесполезные аргументы из ItemHolder .
Чтобы было ясно, что проблема с вашим кодом заключалась RecyclerView.ViewHolder(view) в том, что вы передавали view , пока выполняли все действия, и все остальное в binding этих удержаниях — это два разных экземпляра View . Что должно быть исправлено с помощью приведенного выше кода.

Комментарии:

1. Спасибо за исправление моей ошибки новичка. Пометка как решаемая!