RecyclerView滚动正常但onItemClick方法不触发的问题排查
核心问题定位
你的Adapter代码中存在一处明显错误,导致点击事件被无效拦截:
在onBindViewHolder方法里,你给TextView设置了一个错误的点击监听器,这行代码不仅没有触发预期的点击逻辑,还会消耗掉列表项的点击事件:
holder.textView.setOnClickListener{listener}
这里的lambda表达式只是返回了listener对象,没有执行任何实际的点击回调逻辑,同时因为TextView可能占满了整个列表项布局,点击事件被TextView接收后没有任何响应,进而导致ViewHolder中给itemView设置的正确点击监听无法触发。
修复步骤
删除错误的点击监听代码
直接移除onBindViewHolder中的holder.textView.setOnClickListener{listener}这一行代码。(可选)确保列表项布局中的子控件不抢占焦点
检查你的fragment_meditation_recyclerview_row.xml布局文件,确保TextView的属性设置不会拦截点击事件:<TextView android:id="@+id/gmrowtextview" ... android:focusable="false" android:clickable="false" />这一步是为了避免子控件消耗点击事件,确保整个列表项的点击事件能被
ViewHolder中设置的监听器接收。验证代码逻辑
修复后,ViewHolder中给itemView设置的点击监听器会正常工作:inner class ViewHolder(view: View): RecyclerView.ViewHolder(view), View.OnClickListener{ val textView: TextView = view.findViewById(R.id.gmrowtextview) init { view.setOnClickListener(this) } override fun onClick(v: View?) { val position = bindingAdapterPosition if (position != RecyclerView.NO_POSITION){ listener.onItemClick(position) } } }当点击列表项时,会正确获取当前位置并调用Activity中实现的
onItemClick方法,触发跳转和Toast提示。
额外说明
你的Activity代码逻辑没有问题,传递给Adapter的this(即Activity本身,已实现RecyclerViewEvent接口)是正确的,修复Adapter的错误后即可正常响应点击事件。
内容的提问来源于stack exchange,提问作者Kera Linn

