如何通过列表索引修改TextView文本?解决Kotlin空安全报错
解决Intent传递ArrayList时的可空性错误
错误原因
intent.getIntegerArrayListExtra("result")返回的是ArrayList<Int?>?类型——既可能整个列表为null,列表中的元素也可能为null。Kotlin的空安全机制禁止直接对可空对象执行非空操作,所以会触发报错。
方案1:安全调用+空合并(最稳妥,覆盖所有空场景)
这种方式会处理列表为null、列表为空的情况,给TextView设置默认值:
class ResultActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_result) // 仅当列表不为null时执行排序 val result = intent.getIntegerArrayListExtra("result")?.apply { sort() } val num1 = findViewById<TextView>(R.id.Num1) // 取第一个元素,列表为空或null时用默认值0 val firstNum = result?.firstOrNull() ?: 0 num1.text = firstNum.toString() } }
说明:
- 用Kotlin扩展函数
sort()替代Collections.sort(),更符合Kotlin语法习惯 firstOrNull()在列表为空时返回null,配合?:设置默认值,避免索引越界- 使用
text属性替代setText(),简化代码
方案2:非空断言(仅在确保列表必传且非空时使用)
如果你能100%保证Activity1一定会传递非空的result列表,可以用!!强制非空,但这种方式存在空指针风险:
class ResultActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_result) val result = intent.getIntegerArrayListExtra("result")!! Collections.sort(result) val num1 = findViewById<TextView>(R.id.Num1) num1.text = result[0].toString() } }
方案3:用let函数做分支处理
通过let和?:分别处理列表存在、为空、不存在的场景:
class ResultActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_result) val num1 = findViewById<TextView>(R.id.Num1) intent.getIntegerArrayListExtra("result")?.let { list -> Collections.sort(list) num1.text = if (list.isNotEmpty()) list[0].toString() else "列表为空" } ?: run { num1.text = "未获取到数据" } } }
内容的提问来源于stack exchange,提问作者josephyumss
相关产品推荐
相关产品推荐

