Recyclerview 单击事件不适用于数据绑定和实时数据

Recyclerview click event not working with databinding and livedata

我是 Kotlin 的新手,我正在使用数据绑定库在我从视图模型获取的 recyclerview 中设置项目,并在 activity class 中调用 clicklistener。我已经在我的适配器 class 中定义了一个接口并在 activity 中实现了,但是当我点击 recyclerview 项目并且没有收到任何错误时没有任何反应。我无法找出错误

我的适配器是这样的

class NewsAdapter (private var listener: OnNewsClickListener) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val mCategoryList = ArrayList<Newslist>()

fun setAppList(categoryModel: ArrayList<Newslist>) {
    mCategoryList.addAll(categoryModel)
    //notifyItemRangeInserted(0, categoryModel.size)
    notifyDataSetChanged()
}

override fun getItemCount(): Int {
    Log.d("LIST_SIZE","" + mCategoryList.size)
    return mCategoryList.size
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    val appInfo = mCategoryList[position]
   (holder as NewsAdapter.RecyclerHolderCatIcon).bind(appInfo, listener)
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    val layoutInflater = LayoutInflater.from(parent.context)
    val applicationBinding = ItemNewsBinding.inflate(layoutInflater, parent, false)
    return RecyclerHolderCatIcon(applicationBinding)
}

interface OnNewsClickListener {
    fun onNewsClick(position: Int)
}

inner class RecyclerHolderCatIcon(private var applicationBinding:ItemNewsBinding) : RecyclerView.ViewHolder(applicationBinding.root) {
    fun bind(appInfo:Newslist, listener: OnNewsClickListener?) { 
        applicationBinding.newsItem  = appInfo
    }
} 

}

您需要像这样在bind中设置点击监听器。

这里是示例代码,您需要修改它

fun bind(appInfo:Newslist, listener: OnNewsClickListener?) { 
    applicationBinding.newsItem  = appInfo
    itemView.setOnClickListener( view -> {
        if (listener != null) {
            listener.onNewsClick();
        }
    }
}

因为您没有为表单项布局设置监听器。 您不需要定义 OnClickListener 接口。

inner class RecyclerHolderCatIcon(private var applicationBinding:ItemNewsBinding) : RecyclerView.ViewHolder(applicationBinding.root) {
    fun bind(appInfo:Newslist) { 
        applicationBinding.root.setOnClickListener{ /*handle click here*/ }
    }
}