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。
没有lambda,您可以这样做
adapter.setItemClickListener(object :View.OnItemClickListener{
override fun onItemClick(p0: View?) {
}
})
Run Code Online (Sandbox Code Playgroud)
问题在于您的界面是在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)
| 归档时间: |
|
| 查看次数: |
3986 次 |
| 最近记录: |