如何使MainActivity中的ListView的ArrayAdapter全局化?
我的代码是:
class MainActivity : AppCompatActivity() {
var listItems = ArrayList<String>()
private var listAdapter: ArrayAdapter<String>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
listAdapter = ArrayAdapter(
this,
android.R.layout.simple_list_item_1,
listItems
)
listfield.adapter = listAdapter
listAdapter.add("Hello World!")
listAdapter.add("RFID app")
所以问题是这在编译时给出了错误:无法智能强制转换为ArrayAdapter,因为'listAdapter'是一个可变的属性,这一次可能已被更改。这是因为,当调用.Add时,无法知道另一个线程是否已将listAdapter设置回null。
我需要listAdapter是全局的,因为我需要从回调函数中调用.notifyDataSetChanged()(当条形码读取器读取条形码时,并且如果我在onCreate()中声明listAdapter,则不是可用于回叫功能。因此它必须是一个属性。Kotlin抱怨必须将属性初始化或声明为“抽象”。显然,“抽象”在这里不起作用,但是我不能将其初始化为“ null”以外的其他任何一种,因为初始化需要上下文并且该上下文直到onCreate()才可用。在科特林,人们将如何处理?
谢谢,//乔纳斯
更好的方法是将listAdapter
声明为lateinit
将其更改为:
private lateinit var listAdapter: ArrayAdapter<String>
在Kotlin中,您可以使用companion object
:
companion object {
var listAdapter: ArrayAdapter<String>? = null
}
这使您可以在任何地方使用此适配器。
在您的用例中,通过为其分配所需的值来初始化listAdapter
中的onCreate
,然后可以使用它:
MainActivity.listadapter?.let { instance ->
//here, make use of instance, it is not null and thread safe
}