在Kotlin中设置匿名界面 [英] Setting anonymous interface in Kotlin
问题描述
我的Adapter
类中有一个接口:
interface OnItemClickListener {
fun onItemClick(view: View)
}
请注意,我的interface
在科特林.
TAKE NOTE that my interface
is in Kotlin.
:
public fun setItemClickListener(itemClickListener: OnItemClickListener) {
this.onItemClickListener = itemClickListener
}
如何像在Java中一样在我的Fragment
类中使用setItemClickListener
方法?即
How do I use the setItemClickListener
method in my Fragment
class like what I used to do in Java? i.e.
adapter.setItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view) {
// do something
}
}
我知道我可以使用onItemTouchListener
,但是我对Kotlin还是陌生的,我正在尝试学习诸如Lambdas
之类的一些技术.
I know that I can use an onItemTouchListener
but I am still new to Kotlin and I'm trying to learn some techniques like Lambdas
and such.
推荐答案
问题是您的界面是在Kotlin中定义的(因为它具有fun
). Lambda只能用于Java接口:
The problem is that your interface is defined in Kotlin (since it has fun
). Lambdas can only be used for Java interfaces:
还请注意,此功能仅适用于Java互操作.由于Kotlin具有适当的功能类型,因此不需要将功能自动转换为Kotlin接口的实现,因此不受支持.
Also note that this feature works only for Java interop; since Kotlin has proper function types, automatic conversion of functions into implementations of Kotlin interfaces is unnecessary and therefore unsupported.
因此,在Kotlin中,您应该使用
So in Kotlin you are supposed to use
public fun setItemClickListener(itemClickListener: (View) -> Unit)
而不是定义OnItemClickListener
.您还可以创建一个工厂方法:
instead of defining OnItemClickListener
. You could also create a factory method:
// in Adapter's companion object
public inline fun OnItemClickListener(body: (View) -> Unit) = object : OnItemClickListener {
override fun onItemClick(view: View) { body(view) }
}
然后
adapter.setItemClickListener(Adapter.OnItemClickListener { view -> ... })
这篇关于在Kotlin中设置匿名界面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!