在Kotlin中设置匿名界面

Dal*_*ian 3 java lambda android adapter kotlin

Adapter班上有一个接口:

interface OnItemClickListener {
    fun onItemClick(view: View)
}
Run Code Online (Sandbox Code Playgroud)

请注意,我interface在科特林。

我想通过这种方法设置:

public fun setItemClickListener(itemClickListener: OnItemClickListener) {
    this.onItemClickListener = itemClickListener
}
Run Code Online (Sandbox Code Playgroud)

如何像在Java中一样使用类中的setItemClickListener方法Fragment?即

adapter.setItemClickListener(new OnItemClickListener() {
   @Override
   public void onItemClick(View view) {
    // do something
   }
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用,onItemTouchListener但我对Kotlin还是陌生的,我正在尝试学习诸如此类的技术Lambdas

the*_*del 6

没有lambda,您可以这样做

adapter.setItemClickListener(object :View.OnItemClickListener{
            override fun onItemClick(p0: View?) {

            }
        })
Run Code Online (Sandbox Code Playgroud)


Ale*_*nov 5

问题在于您的界面是在Kotlin中定义的(因为它具有fun)。Lambda仅可用于Java接口

另请注意,此功能仅适用于Java互操作。由于Kotlin具有适当的功能类型,因此不需要将功能自动转换为Kotlin接口的实现,因此不受支持。

因此,在Kotlin中,您应该使用

public fun setItemClickListener(itemClickListener: (View) -> Unit)
Run Code Online (Sandbox Code Playgroud)

而不是定义OnItemClickListener。您还可以创建一个工厂方法:

// in Adapter's companion object
public inline fun OnItemClickListener(body: (View) -> Unit) = object : OnItemClickListener {
    override fun onItemClick(view: View) { body(view) }
}
Run Code Online (Sandbox Code Playgroud)

然后

adapter.setItemClickListener(Adapter.OnItemClickListener { view -> ... })
Run Code Online (Sandbox Code Playgroud)