Android:在我的自定义适配器中使用数据绑定时未分配值

Android: Values are not assigned when using data binding in my custom adapter

我正在尝试将我的适配器绑定变量传递给 ViewHolder 以将值分配给我的适配器中的文本视图,但这些值未分配且点击侦听器不执行任何操作。

这是我的适配器 class:

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)
            }
        }
    }
}

你把里面搞砸了 onCreateViewHolder 。您已经使用 LayoutInflater.from(parent.context) 和一次 DoneAppointmentsAdapterBinding.inflate 创建了两次视图。在这种情况下应该只有一个 onlyDoneAppointmentsAdapterBinding .

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) 当你在 binding 上执行所有操作和东西时你传递了 view 这些保留是 View 的两个不同实例。应该用上面的代码修复。