在 RecyclerView 的适配器中实现的 OnClickListener 不起作用

Posted

技术标签:

【中文标题】在 RecyclerView 的适配器中实现的 OnClickListener 不起作用【英文标题】:OnClickListener implemented in Adapter of RecyclerView not working 【发布时间】:2021-04-21 08:41:27 【问题描述】:

我已经为 RecyclerView 实现了以下适配器。我还包含了处理 RecyclerView 项目点击的代码。但是点击监听器不起作用。

class MyListAdapter(private val titles: ArrayList<String>) :
    RecyclerView.Adapter<MyListAdapter.MyViewHolder>() 

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder 
        return MyViewHolder.create(parent)
    

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) 
        holder.bind(titles[position])
    

    class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
        View.OnClickListener 
        private val myTextView: TextView = itemView.findViewById(R.id.myTextView)
        
        fun bind(title: String) 
            myTextView.text = title
        

        override fun onClick(v: View) 
            Toast.makeText(itemView.context, "Clicked", Toast.LENGTH_SHORT).show()
        

        companion object 
            fun create(parent: ViewGroup): MyViewHolder 
                val view: View = LayoutInflater.from(parent.context)
                    .inflate(R.layout.rv_row, parent, false)
                return MyViewHolder(view)
            
        
    

【问题讨论】:

【参考方案1】:

在您的视图持有者类中添加以下代码:

init
    itemView.setOnClickListener(this)

因此,最终的适配器将如下所示:

class MyListAdapter(private val titles: ArrayList<String>) :
    RecyclerView.Adapter<MyListAdapter.MyViewHolder>() 

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder 
        return MyViewHolder.create(parent)
    

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) 
        holder.bind(titles[position])
    

    class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
        View.OnClickListener 
        private val myTextView: TextView = itemView.findViewById(R.id.myTextView)
        
        init
            itemView.setOnClickListener(this)
        

        fun bind(title: String) 
            myTextView.text = title
        

        override fun onClick(v: View) 
            Toast.makeText(itemView.context, "Clicked", Toast.LENGTH_SHORT).show()
        

        companion object 
            fun create(parent: ViewGroup): MyViewHolder 
                val view: View = LayoutInflater.from(parent.context)
                    .inflate(R.layout.rv_row, parent, false)
                return MyViewHolder(view)
            
        
    

【讨论】:

以上是关于在 RecyclerView 的适配器中实现的 OnClickListener 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Kotlin 在 RecyclerView Adapter 中实现 onClick 并进行数据绑定

在 recyclerview 中实现 facebook 横幅广告

从片段中获取意图值后,我如何在 recyclerview 项目中实现单击

E/RecyclerView:没有附加适配器;跳过布局。尽管初始化适配器

如何在MVVM架构中观察RecyclerView适配器中的LiveData?

如何根据类别实现带有节头的RecyclerView?