【发布时间】:2020-06-17 08:57:43
【问题描述】:
找到答案 -> dataclass copy with field ArrayList - change the ArrayList of the copied class changes the original
我有这个有线错误。我有一个大小为 3 的数组列表。第三项是列表中第二项的副本。我根据他们在名单上的位置来区分他们。问题是,当我执行 for 循环来更改索引 1 处的项目属性时,索引 2 处的项目反映了相同的更改。
What I've tried so far. ...
- 我已确认该列表仅在应用程序中的一处进行了更改。
- 添加了更多字段来区分重复项。
- 设置 if 语句以确保我只更改特定项目。
What I think the solution is.
我的假设是,由于索引 1 & 2 处的项目具有耦合关系,因为它们是彼此重复的。 (即使有差异化因素)我不知道这种关系是什么。
My code snippet.
private fun testing(selectedNormalModifier: ToppingModel) {
var modIndex = -1
selectedNormalModifier.parentPosition = selectedModifierPosition
selectedNormalModifier.localToppingName = modifierGroupModel!!.itemModifierGroups[selectedModifierPosition].itemLocalTitle.toString()
val itemToEdit = modifierGroupModel!!.itemModifierGroups[selectedModifierPosition]
for (i in itemToEdit.modifierGroups.modifiers.indices) {
val mod = itemToEdit.modifierGroups.modifiers[i]
if (mod.title == selectedNormalModifier.toppingName) {
modIndex = i
}
}
itemToEdit.modifierGroups.modifiers[modIndex].isItemSelected = true
mSelectedNormalModifiers.add(selectedNormalModifier)
Log.e(TAG, "how many times did we get here $modifierGroupModel")
}
如您所见,我对要编辑的项目非常具体。无论如何,索引2 处的项目也会被编辑,反之亦然。
This is how I duplicate the items
for (i in modifierGroupModel!!.itemModifierGroups.indices) {
val item = modifierGroupModel!!.itemModifierGroups[i]
// only do this if the display count is greater than one
if (item.modifierGroups.displayCount.toInt() > 1) {
for(i in 0 until item.modifierGroups.displayCount.toInt()){
val localIndex = i + 1
item.itemIndex = localIndex
item.itemLocalTitle = getNumberOfName(localIndex) + " " + item.modifierGroups.modifierGroupTitle
tempItemModifierGroupModel.add(if (i > 0) item.copy() else item)
}
} else {
item.itemIndex = i
tempItemModifierGroupModel.add(item)
}
}
val newModidiferGroupModel = ModifierGroupsModel(
itemID = modifierGroupModel!!.itemID,
itemName = modifierGroupModel!!.itemName,
itemModifierGroups = ArrayList(tempItemModifierGroupModel.toMutableList())
)
modifierGroupModel = newModidiferGroupModel
The JSON object looks like this
"item" {
"nested list"[
"isSelected": "false"
]
},
"item" {
"nested list"[
"isSelected": "false" // when i change this to true
]
},
"item" {
"nested list"[
"isSelected": "false" // this one changes as well
]
}
]```
【问题讨论】:
-
你确定它们是不同的对象 (obj1 != obj2 && obj1.equals(obj2)) 并且不是被引用两次的同一个对象吗?
-
感谢您的快速响应...原来 (obj1 == obj2) 是相等的。我已经添加了如何复制项目的代码 sn-p
-
它们是否相等不是问题。听起来它是对完全相同的对象实例的两个引用。
obj1 === obj2是真的吗? (注意三重 = 符号。) -
if (obj1 === obj2)返回false
标签: android json android-studio for-loop kotlin