Невозможно изменить элементы во вложенном списке массивов

#java #android #android-recyclerview

Вопрос:

У меня ArrayList<Menu> в приложении Menu есть объект, который выглядит так:

 public class Menu {
    public int id;
    public String desc;
    public boolean opzionale;
    public int limite;
    public List<Prodotti> prodotti;
}
 

При выборе пользователя я показываю в своем RecyclerView prodotti . каждое Prodotti действие пользователя может быть изменено, но должно быть изменено только в определенной позиции ArrayList<Menu> .

Поэтому сначала я просто показываю элементы в первой позиции массива, например:

 List<Menu.Prodotti> listProdotti = listMenu.get(fase).prodotti;
 

fase это динамическое значение, указывающее, какие пункты какого меню должны отображаться.

Затем в другой функции я изменяю значение позиции Prodotto at следующим образом:

     Menu.Prodotti prodotto = listProdotti.get(position);
    prodotto.setQta(qtaProdotto   qta);
 

Проблема в том, что после этого все prodotti ArrayList<Menu> at position обновят свое количество.

Так что, если в моем массиве у меня есть такие данные, как:

 ArrayList<Menu.Prodotti> prodotti = new ArrayList<>();
prodotti.add(new Menu.Prodotti("TEST1", "1", 0, 0, 1, 0));
prodotti.add(new Menu.Prodotti("TEST2", "2", 0, 0, 1, 0));
prodotti.add(new Menu.Prodotti("TEST3", "3", 0, 0, 1, 0));
prodotti.add(new Menu.Prodotti("TEST4", "4", 0, 0, 1, 0));
prodotti.add(new Menu.Prodotti("TEST5", "5", 0, 0, 1, 0));

ArrayList<Menu> listMenu = new ArrayList<>();
listMenu.add(new Menu(1, "Fase 1", false, 1, prodotti));
listMenu.add(new Menu(2, "Fase 2", false, 1, prodotti));
listMenu.add(new Menu(3, "Fase 3", false, 1, prodotti));
listMenu.add(new Menu(4, "Fase 4", true, 2, prodotti));
 

И я изменяю listMenu.get(0).prodotti.get(1).setQta(2) ВСЕ продукты в списке в позиции 1, которые будут установлены с Qta 2.

Вся моя логика находится в RecyclerView.Адаптер.

Комментарии:

1. Вы назначаете одно и то же ArrayList<Menu.Prodotti> prodotti всем Menu в списке. Таким образом, все они относятся к одним и тем же объектам. Когда вы меняете его в одном, другие также по-прежнему ссылаются на тот же измененный объект.

2. @csalmhof но почему это происходит, если я действительно получаю продотти в определенной позиции массива? как я могу этого избежать?

3. Всего вы создаете всего 5 объектов Menu.Prodotti . Даже если ваш список содержит 4 разных Menu объекта, каждый из них содержит одни и те же 5 Menu.Prodotti объектов. (Я скоро сформулирую ответ).

4. @csalmhof я только что попытался создать 4 разных списка массивов для prodotti, чтобы установить их в listMenu, но на данный момент, даже если prodotti получают через listMenu.get(позиция), я получаю все prodotti…

Ответ №1:

Вот простой набросок того, как выглядит ваш тестовый случай.

(Внешние коробки ArrayList -это, а внутренние коробки-это объекты Menu и Prodotti )

Набросок рассматриваемого тестового набора

Поэтому, если вы меняете Prodotti 1 из меню 1, вы также меняете Prodotti 1 из меню 2, потому что они ссылаются на один и тот же список и, следовательно, на один и тот же объект Prodotti.

Попробуйте это с помощью такого тестового набора, как этот:

   ArrayList<Menu.Prodotti> prodottiList1 = new ArrayList<>();
  prodotti.add(new Menu.Prodotti("TEST1", "1", 0, 0, 1, 0));
  prodotti.add(new Menu.Prodotti("TEST2", "2", 0, 0, 1, 0));
  prodotti.add(new Menu.Prodotti("TEST3", "3", 0, 0, 1, 0));

  ArrayList<Menu.Prodotti> prodottiList2 = new ArrayList<>();
  prodotti.add(new Menu.Prodotti("TEST4", "4", 0, 0, 1, 0));
  prodotti.add(new Menu.Prodotti("TEST5", "5", 0, 0, 1, 0));
  prodotti.add(new Menu.Prodotti("TEST6", "6", 0, 0, 1, 0));


  ArrayList<Menu> listMenu = new ArrayList<>();
  listMenu.add(new Menu(1, "Fase 1", false, 1, prodottiList1));
  listMenu.add(new Menu(2, "Fase 2", false, 1, prodottiList2));
 

Здесь оба Menu объекта ссылаются на два разных списка, которые содержат разные объекты.

Вот еще один набросок того, как выглядят объекты в приведенном выше коде :

Эскиз тестового набора в ответе

Комментарии:

1. Это то, что я тестировал, но я забыл указать новые списки в списке, поэтому я все еще добавлял один и тот же, в любом случае отличное объяснение, спасибо!