有兩個問題在這裏。
首先,您錯誤地認爲在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
}
接着,在科特林所有參數都final
(JVM改性劑,也一樣final
改性劑中的Java)。這段代碼的科特林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
}
或使用?.
和?:
空運營商合併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
使用一個獨立的變量。沒有必要爲參數分配一個值。 – Henry
比'convertView' PARAM永遠是空,因此每一次新的視圖將被創建。它使意見回收機制完全無用 –
@ oleg.semen沒有,如果從'getView'方法'View'稍後將用作'convertView'返回非空'View' - 使用一個單獨的變量作爲亨利說 – pskink