向已存在的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
相关产品推荐
相关产品推荐

