Почему arraylist1 = arraylist2 не назначает значения arraylist2 для arraylist1? - PullRequest
0 голосов
/ 11 апреля 2019

Это делает RecyclerView пустым:

      public void onTicketsFetched(SupportTicketModel[] fetchedTickets) {
            ArrayList<SupportTicketModel> ticketModelsUpdated = new ArrayList<>(Arrays.asList(fetchedTickets));
            ticketModels.clear();
            ticketModels = ticketModelsUpdated;
            ticketAdapter.notifyDataSetChanged();
      }

Принимая во внимание, что это работает:

     public void onTicketsFetched(SupportTicketModel[] fetchedTickets) {
            ArrayList<SupportTicketModel> ticketModelsUpdated = new ArrayList<>(Arrays.asList(fetchedTickets));
            ticketModels.clear();
            ticketModels.addAll(ticketModelsUpdated);
            ticketAdapter.notifyDataSetChanged();
     }

РАЗНИЦА :

  • Первый : ticketModels = ticketModelsUpdated;

  • Второй : ticketModels.addAll (ticketModelsUpdated);

Насколько я понял, и ticketModels, и ticketModelsUpdated после выполнения ticketModels = ticketModelsUpdated по существу будут ссылаться на один и тот же список.Технически, ticketModels должно иметь каждое значение ticketModelsUpdated.Но это дает мне ошибку.Любая идея?

Я понимаю, ticketMOdels.AddAll(ticketModelsUpdated) создаст два списка с одинаковым значением.И все работает нормально.

Так как дела?

Ответы [ 4 ]

0 голосов
/ 11 апреля 2019

РАЗНИЦА:

  • Первый: ticketModels = ticketModelsUpdated;
  • Второй: ticketModels.addAll (ticketModelsUpdated);

Первый случай: этот случай назначает ссылку ticketModelsUpdated на ticketModels.Таким образом, всякий раз, когда список «ticketModels» изменяется, «ticketModelsUpdated» также изменяется.Вот почему этот случай не работает.

Второй случай: В этом случае присваивается значение ticketModelsUpdated для ticketModels.Таким образом, изменения в списке «ticketModels» не изменят список «ticketModelsUpdated».

0 голосов
/ 11 апреля 2019

Возможно, проблема в адаптере

Предполагается, что вы передаете ticketModels своему адаптеру и сохраните эту ссылку в переменной списка.

Когда вы делаете

ticketModels.addAll(ticketModelsUpdated);

внутренний указатель списка адаптеров всегда ссылается на ticketModels. Итак, это работает.

Но с этим:

ticketModels = ticketModelsUpdated;

Вы изменяете указатель ticketModels, но ваш адаптер всегда указывает на предыдущее значение ticketModel.

Вам также следует обновить указатель списка адаптеров.

0 голосов
/ 11 апреля 2019

В первом случае вы разделяете один и тот же адрес памяти элементов массива между двумя ссылками: ticketModels и ticketModelsUpdated.Это означает, что вы можете иметь доступ к одним и тем же элементам из двух разных точек входа.

Во втором случае вы создаете одинаковые элементы, используя новый адрес памяти.Это означает, что ticketModels не разделяет одно и то же пространство памяти с ticketModelsUpdated.

Несмотря на то, что ticketModelsUpdated является локальной переменной, выделенная память будет жить, пока не будет ссылки на этот адрес.Таким образом, в моем понимании ticketModels должен иметь доступ ко всем элементам даже после уничтожения ticketModelsUpdated.Оба случая должны работать.

РЕДАКТИРОВАТЬ: Похоже, вы привязываете свой адаптер к ссылке ticketModels, а не к значениям ticketModels.Вот почему ваш метод ticketModels.clear() очищает старое выделенное пространство памяти, где был связан ваш адаптер.Таким образом, в первом случае вы меняете ссылку на новое пространство памяти для вашего ticketModels, в то время как ваш адаптер все еще ссылается на очищенное пространство памяти.А во втором случае вы сохраняете ссылку на старое пространство памяти и заполняете очищенные данные новыми элементами.

Это только мое предположение, поскольку вы не предоставили никакой информации о том, как вы связываете свой адаптер с ticketModels.

0 голосов
/ 11 апреля 2019

на Java, списки работают по ссылке.В первой части вы изменяете как адреса памяти, так и значения ваших элементов, в то время как во второй части вы меняете только значения.Вот почему ваше второе решение работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...