【问题标题】:When I edit a list item at a specific index, it affect a similar item in the same list当我在特定索引处编辑列表项时,它会影响同一列表中的类似项
【发布时间】: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. ...

  1. 我已确认该列表仅在应用程序中的一处进行了更改。
  2. 添加了更多字段来区分重复项。
  3. 设置 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


【解决方案1】:

我猜是因为您没有显示您的 Item 数据类,但看起来您不是在编辑列表中的项目,而是一些间接引用的对象。看到这一行:

itemToEdit.modifierGroups.modifiers[modIndex].isItemSelected = true

itemToEdit 未被修改。您正在修改的集合中称为 modifiers 的一些间接引用的对象。

当您copy 一个项目时,它只复制所有属性值。对于非原始属性,值是对类的特定实例的引用。它不执行“深拷贝”。因此,索引 1 和 2 处的项目是不同的对象,但它们引用 modifierGroups 属性中的任何内容的相同实例。

【讨论】:

  • 1.我想我把我的变量名弄糊涂了……我想在给定的索引处编辑“修饰符”。这正在发生。 itemToEdit 应该是 mItem。所以这里真正的问题是,即使我明确留下我想编辑position 1 的项目,它也会编辑position 2 的项目。 ..检查代码 sn-p 以查看 itemToEdit 是什么...我更新了代码 sn-p 2。if (obj1 === obj2) 返回 false 所以我不是指完全相同的实例
【解决方案2】:

我找到了答案。 ---> 这个其他堆栈溢出问题回答了它。 dataclass copy with field ArrayList - change the ArrayList of the copied class changes the original

用户@Andrey_yog

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2020-05-12
    • 2019-10-24
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    相关资源
    最近更新 更多