如何使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个变化,但是你可以尝试看看你喜欢什么。
它被认为是一个不太好的做法(但允许)通过使用相同的名称来映射变量,这就是为什么它是一个编译器警告。 还有为什么你看到上面的变量名称从view
到tempView
正式来说,你不允许重写一个方法参数。 你可以做的最好的是“影”参数变量。
所以你可以这样做(不知道为什么你想要阴影,但你可以)
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 }