onItemClick的viewholder init不起作用

问题描述 投票:0回答:2

我正在研究如何在我的recyclerview上正确添加onClick事件,

当前我正在使用我的customAdapter内部的接口

class CategoryAdapter(val categoryList : List<CategoryObject>, val context: Context, val mItemClickListener: MainInterface) : RecyclerView.Adapter<CategoryAdapter.ViewHolder>() {

interface MainInterface {
    fun onCategoryItemClick(categoryKey: Int)
}

override fun getItemCount(): Int {
    return categoryList.size
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    return ViewHolder(LayoutInflater.from(context).inflate(R.layout.listview_category, parent, false))
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder?.categoryName?.text = categoryList[position].categoryName
//        holder?.categoryName.setOnClickListener{
//            mItemClickListener.onCategoryItemClick(position)
//        }
//        holder?.categoryName?.setOnClickListener { listener(categoryList[position]) }
}

inner class ViewHolder (view: View) : RecyclerView.ViewHolder(view) {
    val categoryName = view.lv_txt_category_name

    init {
        view.setOnClickListener {
            mItemClickListener.onCategoryItemClick(adapterPosition)
        }
    }
}

}  

viewHolder的onClick不在我的活动ovveride函数上注册。

但是将onClick放到onBindViewHolder上效果很好,

我不确定哪种方法更有效,如果onBindViewHolder onClick是正确的答案,那么我会坚持下去,但是如果viewHolder是正确的,为什么它不能正常工作?

谢谢!

更新这是我用来研究事物的stackoverflow帖子

RecyclerView itemClickListener in Kotlin

android kotlin onclicklistener recycler-adapter
2个回答
0
投票

在xml中试过android:clickable =“ true”?


0
投票

根据文档的建议:

RecyclerView.Adapter.html#onBindViewHolder

由RecyclerView调用以在指定位置显示数据。此方法应更新itemView的内容以反映给定位置的项目。

并且对于RecyclerView.Adapter.html#onCreateViewHolder

当RecyclerView需要新的RecyclerView.ViewHolder时调用给定类型以表示项目。

此新ViewHolder应该使用可以代表给定类型的项目。您可以创建一个新手动查看或从XML布局文件中对其进行充气。

由于onCreateViewHolder是仅在onBindViewHolder中更新或初始化要显示的数据时才返回ViewHoldertype的方法。

这表示onCreateViewHolder中没有数据binded,并且用此方法绑定任何内容均无效。

© www.soinside.com 2019 - 2024. All rights reserved.