kotlin android – Diálogo personalizado con patrón de construcción y Java 8 lambda

Tengo un patrón de generador de seguimiento definido de class de Diálogo personalizado. No tengo ningún problema con mi código. Pero ahora quiero rebuild para poder usar en java 8 lambda

CustomDialogList.kt

class CustomDialogList(context: Context, private var title: Int?, private var icon: Int?, private var map: Map<String, Any>, 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<String> = mutableListOf() val listObject: MutableList<Any> = mutableListOf() for ((k, v) in map) { listString.add(k) listObject.add(v) } val adapter = ArrayAdapter<String>(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<String, Any> = 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<String, Any>): 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() } } 

La syntax que tengo después define

 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() 

Y aquí hay un ejemplo que quiero build

 CustomDialogList.Builder(this) .withTitle(R.string.add) .withIcon(R.drawable.ic_add) .withMap(mapOf()) .setOnItemClick({ dialog, obj, text, position -> // do something dialog.dismiss() }) .show() 

Esta es la primera vez que publico una pregunta, espero que todos me disculpen por mi mal inglés. Y gracias por ayudarme alguien 🙂

    KT-7770 : SAM no funciona para las interfaces definidas en Kotlin.

    En otras palabras, la expresión lambda

     { dialog, obj, text, position -> ... } 

    puede ser una interfaz funcional de Java o una function de Kotlin, pero no una interfaz funcional de Kotlin.

    Si elimina su interfaz OnItemClickListener y escribe

     typealias OnItemClickListener = (CustomDialogList, Any?, String, Int) -> Unit 

    en el nivel superior, o modifique las firmas de tipo, su segundo ejemplo funcionará (y el primero fallará). Si en cambio define la interfaz en Java, ambos funcionarán.