【问题标题】:viewholder init for onItemClick is not workingonItemClick 的查看器初始化不起作用
【发布时间】:2020-02-27 20:01:37
【问题描述】:

我正在研究如何在我的 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

【问题讨论】:

  • 你试过在itemView而不是view上设置点击监听???
  • @hamid_c,itemView 不工作 :(
  • 你的意思是你在init中使用itemView.setOnClickListener { }而不是view.setOnClickListener { },但结果是一样的???
  • @hamid_c,是的,但仍然没有调用我在活动中的覆盖函数。
  • 你能在你的view.setOnClickListener 中添加一个Log 并在Logcat 中检查它是否被调用???

标签: android kotlin onclicklistener android-recyclerview


【解决方案1】:

在您的 xml 中尝试过 android:clickable="true" 吗?

【讨论】:

  • 我认为您不需要添加此内容,但尝试一下也无妨,仍然...无法正常工作
【解决方案2】:

按照文档的建议:

RecyclerView.Adapter.html#onBindViewHolder

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

对于RecyclerView.Adapter.html#onCreateViewHolder

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

这个新的 ViewHolder 应该用一个新的 View 来构造,它可以 表示给定类型的项目。您可以创建一个新的 手动查看或从 XML 布局文件扩展。

由于onCreateViewHolder 是一种我们返回ViewHoldertype 的方法,只有在onBindViewHolder 中我们更新或初始化要显示的数据。

这意味着onCreateViewHolder中没有绑定数据,在这个方法中绑定任何东西都没有效果。

【讨论】:

  • 那么,这是否意味着即使我将 onClicklistener 放在 OnBindViewHolder 中,它也不会创建内存泄漏事件??
  • @MaCheeNeraid 确实是一个非常好的问题。尽管许多文章/博客都使用这种方法,但我认为最好在onBindViewHolder 中设置clickListener,因为除非将侦听器定义为static,否则几乎不会发生内存泄漏。我建议您在以下链接中对此进行非常好的解释stackoverflow.com/questions/35086967/…
  • 感谢您的链接!只是补充一下,实际上我还使用了 lambda 表达式“(category) -> Unit?”。这是最快和最简单的方法,但 android profiler 显示我的活动不是垃圾收集,即使我强迫它。这就是我避免使用 lambda 的原因。
  • 如果 RecyclerView 适配器仅被 Activity 本身引用,它不会泄露您的 Activity。一个 lambda 编译为一个接口的实现,所以这不是你泄漏的原因,如果你确实有的话。
  • 我不认为这个解释是它不起作用的原因。 RecyclerView.Adapter 中没有任何内容会遍历所有视图并删除您在onBindView 之前设置的点击侦听器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多