2017-07-15 32 views
1

我有一个自定义对话框类定义跟随生成器模式。我的代码没有问题。但现在我要重建能够在Java的8拉姆达kotlin android-自定义对话框与生成器模式和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() 
    } 
} 

使用的语法我已经定义后

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

这是我第一次发帖提问,希望大家原谅我英文不好。并感谢你的任何人都可以帮助我:)

回答

1

KT-7770:SAM不适用于在Kotlin中定义的接口。

换句话说,λ表达式

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

可以是Java功能接口或功能科特林,但不是一个科特林功能接口。

如果您删除OnItemClickListener接口,并在顶层写

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

,或修改类型签名,你的第二个例子就可以了(和你的第一个会失败)。如果你改用Java定义接口,两者都可以工作。