user14598168
user14598168

Reputation:

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

I'm trying to pass my binding variable for the adapter to the ViewHolder to assing values to the textviews in my adapter but the values are not assigned and the click listeners dont do anything.

Here's my adapter 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)
            }
        }
    }
}

Upvotes: 0

Views: 237

Answers (1)

SpiritCrusher
SpiritCrusher

Reputation: 21043

You have messed up inside onCreateViewHolder . you have created view twice once with the LayoutInflater.from(parent.context) and once with DoneAppointmentsAdapterBinding.inflate . There should be only one in this case 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)
            }
        }
    }
}

It should be like this . I have also removed extra useless arguments from ItemHolder . To make it clear the problem with your code was RecyclerView.ViewHolder(view) you were passing view while you were doing all action and stuff on binding those holds are two different instances of View . Which should be fixed with above code.

Upvotes: 1

Related Questions