如何声明最近将在 Kotlin 中初始化的属性?

Rol*_*ter 0 android kotlin

如何在 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")
Run Code Online (Sandbox Code Playgroud)

所以问题是这会在编译时出现错误: 智能转换为 ArrayAdapter 是不可能的,因为 'listAdapter' 是一个可变属性,此时可能已更改。 这是因为无法知道在调用 .Add 时另一个线程是否已将 listAdapter 设置回 null。

我需要 listAdapter 是全局的,因为我需要从回调函数中调用 .notifyDataSetChanged()(当条形码阅读器读取条形码时),如果我在 onCreate() 中声明 listAdapter,它不可用回调函数。所以它必须是一个属性。Kotlin 抱怨属性必须被初始化或声明为“抽象”。显然“抽象”在这里不起作用,但我不能将它初始化为“null”以外的其他形式,因为初始化需要上下文,并且上下文在 onCreate() 之前不可用。在 Kotlin 中如何处理这个问题?

iCa*_*ntC 6

更好的方法是声明listAdapterlateinit

将其更改为:

private lateinit var listAdapter: ArrayAdapter<String>
Run Code Online (Sandbox Code Playgroud)