You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向已存在的AlertDialog动态添加列表项失效问题求解

问题根因

你调用AlertDialog.Builder.setItems()时,内部会基于你传入的定长数组创建ArrayAdapter,该Adapter会持有原始数组的引用。
Kotlin中arrayOf创建的是定长数组,list += "New Item"的操作本质是生成一个包含原数组所有元素+新元素的新数组对象,再赋值给list变量,此时Adapter持有的仍然是旧数组的引用,自然感知不到新元素的添加。
而你修改list[0]是直接修改旧数组内部的元素,Adapter可以正常感知到变更,所以更新生效。

解决方法

推荐改用可变集合,手动创建ArrayAdapter绑定到AlertDialog,示例代码如下:

// 改用MutableList作为数据源
val list = mutableListOf("aa")
// 手动创建ArrayAdapter,绑定可变集合
val adapter = ArrayAdapter(context, android.R.layout.simple_list_item_1, list)
val b = AlertDialog.Builder(context)
// 不要用setItems,改为直接设置adapter和点击事件
b.setAdapter(adapter) { _, which ->
    // 替换为你原有点击逻辑,which为选中项下标
    onItemClickListener.onClick(null, which)
}
val dialog = b.create()
dialog.show()

executeGetRequest() {
    // 直接修改原始的可变集合,无需更换对象
    list.add("New Item")
    // 网络请求回调默认不在主线程,更新UI必须切到主线程执行
    context.runOnUiThread {
        adapter.notifyDataSetChanged()
    }
}

注意事项

如果一定要用数组实现,更新后需要调用adapter.clear()把旧数据清空,再把新数组的所有元素逐一加入adapter,最后调用notifyDataSetChanged()即可生效,但整体易用性不如直接使用可变集合。

内容的提问来源于stack exchange,提问作者Rondev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:45:04