#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
объекта, каждый из них содержит одни и те же 5Menu.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. Это то, что я тестировал, но я забыл указать новые списки в списке, поэтому я все еще добавлял один и тот же, в любом случае отличное объяснение, спасибо!