如何使Kotlin中的方法参数变化?

我正在Android项目中实现一个SpinnerAdapter 。 所以我必须重写getView(i: Int, convertView: View, parent: ViewGroup)方法。 所以convertView在这里是为了重用现有的视图,并减少内存使用和GC的发生。 所以,如果它是null我必须创建视图和使用已经创建否则。

所以实际上我必须写这样的东西(谷歌正式推荐):

 if (view == null) { view = View.inflate(context, R.layout.item_spinner, parent) view.tag(Holder(view)) } else { (view.tag as Holder).title.text = getItem(i) } 

但是Kotlin不允许写param。 我在互联网上发现的是一个官方的博客文章 ,说自2013年2月以来,这是不可能的。

所以我想知道是否有任何解决方法?

这里有两个问题。

首先,你错误地view在Java中修改view在当前函数范围之外做任何事情。 它不是。 您将该参数设置为新的值不会影响本地函数作用域之外的任何内容。

 View getView(int i, View view, ViewGroup parent) { // modify view here does nothing to the original caller reference to view // but returning a view does do something } 

接下来,在Kotlin中,所有的参数都是final (JVM修饰符,与Java中的final修饰符相同)。 这个代码的Kotlin if语句版本是:

 fun getView(i: Int, view: View?, parent: ViewGroup): View { return if (view == null) { val tempView = View.inflate(context, R.layout.item_spinner, parent) tempView.tag(Holder(tempView)) tempView } else { (view.tag as Holder).title.text = getItem(i) view } } 

或避免新的局部变量:

 fun getView(i: Int, view: View?, parent: ViewGroup): View { return if (view == null) { View.inflate(context, R.layout.item_spinner, parent).apply { tag(Holder(this)) // this is now the new view } } else { view.apply { (tag as Holder).title.text = getItem(i) } } } 

要么

 fun getView(i: Int, view: View?, parent: ViewGroup): View { if (view == null) { val tempView = View.inflate(context, R.layout.item_spinner, parent) tempView.tag(Holder(tempView)) return tempView } (view.tag as Holder).title.text = getItem(i) return view } 

或者使用?.?: null运算符与apply()结合使用:

 fun getView(i: Int, view: View?, parent: ViewGroup): View { return view?.apply { (tag as Holder).title.text = getItem(i) } ?: View.inflate(context, R.layout.item_spinner, parent).apply { tag(Holder(this)) } } 

还有另外10个变化,但是你可以尝试看看你喜欢什么。

它被认为是一个不太好的做法(但允许)通过使用相同的名称来映射变量,这就是为什么它是一个编译器警告。 还有为什么你看到上面的变量名称从viewtempView

正式来说,你不允许重写一个方法参数。 你可以做的最好的是“影”参数变量。

所以你可以这样做(不知道为什么你想要阴影,但你可以)

 getView(i: Int, view: View?, parent: ViewGroup) { val view = view ?: View.inflate(context, R.layout.item_spinner, parent) .apply { tag(Holder(view)) } (view.tag as Holder).title.text = getItem(i) } 

Kotlin 支持可变参数。

我想引用你在kotlinlang.org这个讨论 。

有一个肮脏但有用的方法来实现这一点。

 fun a(b: Int) { var b = b b++ // this compiles }