[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个回答
4
投票

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

将其更改为:

private lateinit var listAdapter: ArrayAdapter<String>

0
投票

之所以这样,是因为Kotlin无法判断该属性是否为null,您有2个选择来修复错误:

  1. 添加!!运算符,如果变量为null,将抛出错误,例如:listAdapter!!.add("Hello World!")
  2. 使用lateinit选项。此选项更好,因为根据您的情况,适配器永远不能为null。
© www.soinside.com 2019 - 2024. All rights reserved.