kotlin android – 用Builder模式和Java 8 lambda定制对话框
我有一个自定义对话框类定义跟随生成器模式。 我的代码没有问题。 但是现在我想重建能够在java 8 lambda上使用
CustomDialogList.kt
class CustomDialogList(context: Context, private var title: Int?, private var icon: Int?, private var map: Map, private var listner: OnItemClickListener) : Dialog(context) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.custom_dialog_list) txtTitle.text = context.getString(title!!) txtTitle.setCompoundDrawablesWithIntrinsicBounds(icon!!, 0, 0, 0) val listString: MutableList = mutableListOf() val listObject: MutableList = mutableListOf() for ((k, v) in map) { listString.add(k) listObject.add(v) } val adapter = ArrayAdapter(context, android.R.layout.simple_list_item_1, listString) listView.adapter = adapter listView.setOnItemClickListener { _, _, i, _ -> listner.onClickResult(this, listObject[i], listString[i], i) } } interface OnItemClickListener { fun onClickResult(dialog: CustomDialogList, obj: Any?, text: String, position: Int) } class Builder(private var context: Context) { private var listner: OnItemClickListener? = null private var title: Int? = null private var icon: Int? = null private var map: Map = mapOf() fun withTitle(title: Int): Builder { this.title = title return this } fun withIcon(icon: Int): Builder { this.icon = icon return this } fun withMap(map: Map): Builder { this.map = map return this } fun setOnItemClick(listner: OnItemClickListener): Builder { this.listner = listner return this } fun show() = CustomDialogList(context, title, icon, map, listner!!).show() } }
定义后的语法
CustomDialogList.Builder(this) .withTitle(R.string.add) .withIcon(R.drawable.ic_add) .withMap(mapOf()) .setOnItemClick(object : CustomDialogList.OnItemClickListener { override fun onClickResult(dialog: CustomDialogList, obj: Any?, text: String, position: Int) { // do something dialog.dismiss() } }) .show()
这是我想要构建的一个例子
CustomDialogList.Builder(this) .withTitle(R.string.add) .withIcon(R.drawable.ic_add) .withMap(mapOf()) .setOnItemClick({ dialog, obj, text, position -> // do something dialog.dismiss() }) .show()
这是我第一次发贴问题,希望大家可以原谅我的英文不好。 并感谢任何人都可以帮助我:)
KT-7770 :SAM不适用于在Kotlin中定义的接口。
换句话说,lambdaexpression式
{ dialog, obj, text, position -> ... }
可以是Java函数接口或Kotlin函数,但不是Kotlin函数接口。
如果删除了OnItemClickListener
接口并写入
typealias OnItemClickListener = (CustomDialogList, Any?, String, Int) -> Unit
在顶层,或修改types签名,你的第二个例子将工作(你的第一个将失败)。 如果你用Java定义接口,两者都可以工作。
- 服务器套接字侦听客户端与轮询服务的Android即时通讯应用程序
- 即使数据没有更新,数值也会发出
- 未解决的参考:DaggerTestComponent(Kotlin用匕首测试)
- 如何在Android的Activity中使用onItemLongClickListener?
- 使用kotlin的自定义风格中的ClassNotFoundException
- 如何解决INSTALL_FAILED_DEXOPT这个错误?
- RxJava Observable to Completable,如何避免toBlocking()
- 即使在androidTest包中,Kotlin类也会作为junit测试运行 – 对于Java类,它运行正常
- 在kotlin中,如何传递一个MutableList,其中目标需要一个List