我正在研究如何在我的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帖子
在xml中试过android:clickable =“ true”?
根据文档的建议:
RecyclerView.Adapter.html#onBindViewHolder
由RecyclerView调用以在指定位置显示数据。此方法应更新itemView的内容以反映给定位置的项目。
并且对于RecyclerView.Adapter.html#onCreateViewHolder
当RecyclerView需要新的RecyclerView.ViewHolder时调用给定类型以表示项目。
此新ViewHolder应该使用可以代表给定类型的项目。您可以创建一个新手动查看或从XML布局文件中对其进行充气。
由于onCreateViewHolder
是仅在onBindViewHolder
中更新或初始化要显示的数据时才返回ViewHolder的type的方法。
这表示onCreateViewHolder
中没有数据binded,并且用此方法绑定任何内容均无效。