【问题标题】:How to add onClickListener to the items of the recyclerView in Kotlin?如何将 onClickListener 添加到 Kotlin 中的 recyclerView 的项目中?
【发布时间】:2020-10-07 20:55:34
【问题描述】:

我正在使用 recyclerView 显示来自 firebase 数据库的数据,并且我想处理点击, 现在重要的部分是我想知道被点击的数字,以便在显示下一个活动之前在应用计费中测试 google play 我的意思是用户应该点击第一个项目然后付费查看第一个信息等等 有什么帮助吗?

//my adapter

class MyAdapter(
    private val arrayList: ArrayList<Long>
) :
    RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

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

    override fun getItemCount() = arrayList.size

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.number.text = arrayList[position].toString()
    }

    class MyViewHolder(view: View) :
        RecyclerView.ViewHolder(view) {
        val number = view.findViewById<View>(R.id.singleNumberId) as TextView
    }

}

【问题讨论】:

    标签: android firebase kotlin android-recyclerview


    【解决方案1】:

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

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

    然后在实例化后使用适配器的任何地方都可以:

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

    【讨论】:

    • ViewHolders 可以放入一个公共池中以供重用,因此这里可能需要注意的是泄漏回调 PatientSelectedCallback 及其依赖链。 developer.android.com/reference/androidx/recyclerview/widget/…
    • @MarkKeen 绝对值得一提,大声笑,我自己从未使用过该功能,所以我想我从未遇到过这个问题,但对于 OP 或其他任何人都知道有好处!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    相关资源
    最近更新 更多