Android全局ArrayAdapter是否可能?,(在Kotlin中)

问题描述 投票:0回答:2

如何使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()才可用。在科特林,人们将如何处理?

谢谢,//乔纳斯

android kotlin android-arrayadapter global
2个回答
1
投票

更好的方法是将listAdapter声明为lateinit

将其更改为:

private lateinit var listAdapter: ArrayAdapter<String>

0
投票

在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
}
© www.soinside.com 2019 - 2024. All rights reserved.