gpt4 book ai didi

android - Kotlin中view.setOnLongClickListener和view.onClick的比较

转载 作者:行者123 更新时间:2023-11-29 18:48:59 25 4
gpt4 key购买 nike

我试图从我的回收器 View 适配器调用另一个函数,我在我的 holder.itemView 中添加了 onclick 监听器。我在我的 Activity 中尝试了 setOnClickListeneronClick 并将 this@MainActivity 作为 context 参数,它工作正常。

btn.setOnClickListener { showDialog(this@MainActivity) }
btn.onClick { showDialog(this@MainActivity) }

但是 onClick 不会在适配器中工作,因为

holder.itemView.setOnClickListener {
showDialog(context, notes[position])
} // This works fine

// Type mismatch required Context, Found CoroutineContext
holder.itemView.onClick { showDialog(context, notes[position]) }

如果我想使用 onClick 而不是 setOnClickListener,我应该怎么做才能解决这个问题

最佳答案

也许试试这个:

class NotesAdapter(private val ctx: Context) : RecyclerView.Adapter<NotesAdapter.NotesViewHolder>() {
// Etc
holder.itemView.onClick { showDialog(ctx, notes[position]) }
}

编辑 - 解释

无论如何我都不是 Kotlin 的专家,但是您遇到的错误是关于正在发生的事情的非常明确的线索。

当您在后台调用 holder.itemView.onClick 时,您正在调用 itemView.setOnClickListener,它采用 View.OnClickListener 的实例。所以你可以做这样的事情,它可能会工作得很好:

class NotesAdapter(private val context: Context) : RecyclerView.Adapter<NotesAdapter.NotesViewHolder>() {
// Etc
holder.itemView.onClick(View.OnClickListener(){
void onClick(v: View) {
showDialog(context, notes[position])
}
})
}

相反,您想使用一些 Kotlin 简洁的语法并向其传递一个 lambda。这是完全有效的,而且更干净。但是,lambda(或协程)似乎也有一个名为 context 的字段,并且它有一种 CoroutineContext 类型。继续上面的示例,它等效于此:

holder.itemView.onClick(View.OnClickListener(){
var context: CoroutineContext
void onClick(v: View) {
showDialog(context, notes[position])
}
})

在这种情况下,当您调用 showDialog 时,您会得到当前范围的“上下文”,它是错误的类型,这就是您收到类型不匹配错误的原因。

在 Java 中还有另一种解决方案,我只是不知道等效的 Kotlin 语法。你会做这样的事情:

holder.itemView.onClick { showDialog(NotesAdapter.this.context, notes[position]) }

这只是告诉编译器您正在寻找的上下文在 NotesAdapter 范围内而不是在 Coroutine 范围内的另一种方式

关于android - Kotlin中view.setOnLongClickListener和view.onClick的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51263356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com