在Kotlin中设置匿名界面 [英] Setting anonymous interface in Kotlin

查看:91
本文介绍了在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆