Когда я редактирую элемент списка с указанным индексом c, он влияет на аналогичный элемент в том же списке - PullRequest
0 голосов
/ 04 марта 2020

Найден ответ -> копия класса данных с полем ArrayList - изменение ArrayList скопированного класса изменяет оригинал

У меня есть эта проводная ошибка. У меня есть список массива размером 3. Третий элемент является дубликатом второго элемента в списке. Я различаю их в зависимости от их позиции в списке. Проблема в том, что когда я делаю для l oop, чтобы изменить свойства элемента с индексом 1, элемент с индексом 2 отражает то же самое изменение.

What I've tried so far. ...

  1. Я подтвердил, что список изменяется только в одном месте приложения.
  2. Добавлено больше полей для различения дубликатов.
  3. Установите операторы if, чтобы убедиться, что я изменяю только указанный элемент c.

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")
}

Как видите, я очень конкретен c на элемент, который я хочу редактировать. Независимо от этого, элемент с индексом 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
      ]
   }
]```






Ответы [ 2 ]

1 голос
/ 04 марта 2020

Я предполагаю, что вы не показывали свой класс данных Item, но похоже, что вы редактируете не элемент в своем списке, а какой-то объект с косвенной ссылкой. Смотрите эту строку:

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

itemToEdit не изменяется. Некоторый объект с косвенной ссылкой в ​​коллекции под названием modifiers - это то, что вы изменяете.

Когда вы copy Item, он копирует только все значения свойств. Для не примитивного свойства значение является ссылкой на указанный c экземпляр класса. Он не выполняет "глубокое копирование". Таким образом, ваши элементы с индексами 1 и 2 - это разные объекты, но они ссылаются на один и тот же экземпляр того, что находится в свойстве modifierGroups.

0 голосов
/ 05 марта 2020

Я нашел ответ. ---> на этот другой вопрос Stack Overflow ответили. копия класса данных с полем ArrayList - изменение ArrayList скопированного класса изменяет оригинал

Пользователь @ Andrey_yog

...