【问题标题】:Why arraylist1 = arraylist2 doesnot assign values of arraylist2 to arraylist1?为什么arraylist1 = arraylist2 不将arraylist2 的值分配给arraylist1?
【发布时间】:2019-04-11 08:25:36
【问题描述】:

这会使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);

据我了解,ticketModelsticketModelsUpdated 完成后,ticketModels = ticketModelsUpdated 基本上将引用同一个列表。所以从技术上讲,ticketModels 的每个值都应该是ticketModelsUpdated。但这给了我错误。有什么想法吗?

我了解ticketMOdels.AddAll(ticketModelsUpdated) 将创建两个相同值的列表。它工作正常。

怎么了?

【问题讨论】:

  • 将“ArrayList ticketModelsUpdated”声明为全局,然后将其分配为“ticketModels = ticketModelsUpdated;”因为您在 void 方法中分配您的列表,该方法是本地的并且会被破坏。所以你必须全局声明它
  • @android 我做到了,但还是不行!

标签: android arraylist android-recyclerview


【解决方案1】:

在 Java 中,列表通过引用工作。在第一部分中,您将更改项目的内存地址和值,而在第二部分中,您仅更改值。这就是您的第二个解决方案有效的原因。

【讨论】:

    【解决方案2】:

    问题可能出在您的适配器中

    假设您将ticketModels 传递给您的适配器,并将此引用保存在列表变量中。

    当你这样做时

    ticketModels.addAll(ticketModelsUpdated);
    

    内部适配器列表指针始终引用ticketModels。所以,它有效。

    但是有了这个:

    ticketModels = ticketModelsUpdated;
    

    您正在更改 ticketModels 指针,但您的适配器始终指向之前的 ticketModel 值。

    您还应该更新您的适配器列表指针。

    【讨论】:

      【解决方案3】:

      区别:

      • 首先:ticketModels = ticketModelsUpdated;
      • 二:ticketModels.addAll(ticketModelsUpdated);

      第一种情况:这种情况将ticketModelsUpdated的引用分配给ticketModels。因此,每当“ticketModels”列表被修改时,“ticketModelsUpdated”也会被修改。这就是为什么这个案子没有成功的原因。

      第二种情况:这种情况只将ticketModelsUpdated的值赋给ticketModels。所以“ticketModels”列表的变化不会修改“ticketModelsUpdated”列表。

      【讨论】:

        【解决方案4】:

        在第一种情况下,您在两个链接之间共享相同的数组元素内存地址:ticketModelsticketModelsUpdated。这意味着您可以从两个不同的入口点访问相同的元素。

        在第二种情况下,您使用新的内存地址创建相同的元素。这意味着ticketModels 不与ticketModelsUpdated 共享相同的内存空间。

        尽管ticketModelsUpdated 是局部变量,但分配的内存将一直存在,直到有对该地址的引用。因此,在我的理解中,ticketModels 应该可以访问所有元素,即使在 ticketModelsUpdated 被销毁之后也是如此。两种情况都应该有效。

        编辑:看起来您将适配器绑定到 ticketModels 的引用而不是 ticketModels 的值。这就是为什么您的方法ticketModels.clear() 会清除您的适配器链接到的旧分配内存空间。因此,在第一种情况下,您将链接更改为 ticketModels 的新内存空间,而您的适配器仍引用已清除的内存空间。在第二种情况下,您保留对旧内存空间的引用,并用新元素填充清除的数据。

        这只是我的猜测,因为您没有提供任何信息如何将您的适配器与ticketModels 绑定。

        【讨论】:

          猜你喜欢
          • 2015-08-09
          • 2019-04-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多