且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何在Kotlin中将onClickListener添加到recyclerView的项目中?

更新时间:2023-12-02 23:40:40

这是我注册RecyclerView适配器项的点击的一个小例子:

Here is a small example I have of registering a click for a RecyclerView adapter item:

class PatientListAdapter : ListAdapter<Patient, PatientListAdapter.PatientViewHolder>(co.za.abcdefgh.viewmodels.PatientListViewModel.DiffItemCallback) {

    // this property will be used to set the onclick callback for the entire adpater
    var onPatientSelectedCallback: PatientSelectedCallback? = null

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): PatientViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_patient, parent, false) as View
        return PatientViewHolder(view)
    }

    override fun onBindViewHolder(holder: PatientViewHolder, position: Int) {
        holder.view.item_patient_name.text = getItem(position).toString()
        holder.view.item_patient_folderNumber.text = getItem(position).folderNumber

        // lets set our on click for each viewholder here
        holder.view.item_patient_info_card.setOnClickListener {
            // the secret sauce .... getItem(holder.adapterPosition)
            onPatientSelectedCallback?.onPatientSelected(getItem(holder.adapterPosition))
        }
    }

    class PatientViewHolder(val view: View) : RecyclerView.ViewHolder(view)

    // interface which defines a method signature that will called when a item in the adpater is selected
    interface PatientSelectedCallback {
        fun onPatientSelected(patient: Patient)
    }
}

,然后在实例化后使用适配器的任何地方只需执行以下操作:

and then wherever you use the adapter after instantiating simply do:

val viewAdapter = PatientListAdapter()

viewAdapter.onPatientSelectedCallback =
    object : PatientListAdapter.PatientSelectedCallback {
        override fun onPatientSelected(patient: Patient) {
            // do something with the chosen item
            patientViewModel.setPatient(patient)
        }
    }