Kotlin向MutableMap动态添加键值对仅存最后一项问题排查
Kotlin MutableMap 动态添加键值对方法及问题修复
问题根因
- 你在弹窗初始化阶段就提前读取了输入框的文本,此时用户还未输入内容,提前缓存的
keyjson、valuejson是固定的初始值,后续点击添加按钮时从未重新读取输入框的最新内容,所有添加操作都在复用同一个固定键。 - 每次执行
showDialogBody()方法时,你都会重新创建一个新的MutableMap赋值给jsonMap,之前存储的所有条目会被直接清空。 - MutableMap的键具有唯一性,对同一个键重复执行
put操作只会覆盖对应的值,不会新增条目,因此最终Map里只会留存最后一次覆盖后的单条数据。
MutableMap添加键值对的标准写法
Kotlin中为可变映射动态添加键值对有两种常用写法,效果完全一致:
- 调用
put方法:jsonMap.put(键, 值) - 使用操作符简写:
jsonMap[键] = 值(更符合Kotlin编码习惯)
修复后可正常运行的代码
// 若需要保留多次打开弹窗添加的条目,将Map初始化放在方法外部 // 若需要每次打开弹窗清空历史数据,可将初始化移到方法内,注意初始化为空map即可 private var jsonMap = mutableMapOf<String, String>() private fun showDialogBody() { val dialog = Dialog(this) dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) dialog.setCancelable(true) dialog.setContentView(R.layout.dialogue_view) val bodyKey = dialog.findViewById(R.id.key) as EditText val bodyValue = dialog.findViewById(R.id.value) as EditText val addBtn = dialog.findViewById(R.id.dialogDismiss_button) as Button val finishBtn = dialog.findViewById(R.id.dialogDismiss_finish_button) as Button addBtn.setOnClickListener { // 点击添加按钮时才实时读取输入框的最新内容,不要提前缓存 val currentKey = bodyKey.text.toString().trim() val currentValue = bodyValue.text.toString().trim() // 空键校验,避免无效数据存入 if (currentKey.isNotEmpty()) { jsonMap[currentKey] = currentValue Toast.makeText(this, "$currentKey Added", Toast.LENGTH_SHORT).show() bodyKey.text.clear() bodyValue.text.clear() } } finishBtn.setOnClickListener { dialog.dismiss() Toast.makeText(this, "number of key value ${jsonMap.size}", Toast.LENGTH_SHORT).show() } dialog.show() }
注意:如果需要允许同一个键对应多个值,不要使用普通MutableMap,改用
MutableMap<String, MutableList<String>>结构,添加值时向对应键的列表中追加元素即可。
内容的提问来源于stack exchange,提问作者Ahmed Rabee
相关产品推荐
相关产品推荐

