这使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)
将创建两个值相同的列表。而且工作正常。
那怎么了?
答案 0 :(得分:0)
在Java中,按引用列出工作。在第一部分中,您将更改内存地址和项目值,而在第二部分中,仅更改值。这就是您的第二个解决方案起作用的原因。
答案 1 :(得分:0)
问题可能出在您的适配器上
假设您将ticketModels
传递给适配器,并将此引用保存在列表变量中。
这样做的时候
ticketModels.addAll(ticketModelsUpdated);
内部适配器列表指针始终在引用ticketModel。因此,它有效。
但是,这个:
ticketModels = ticketModelsUpdated;
您正在更改ticketModels指针,但是适配器始终指向先前的ticketModel值。
您还应该更新适配器列表指针。
答案 2 :(得分:0)
在第一种情况下,您在两个链接ticketModels
和ticketModelsUpdated
之间共享数组元素的相同内存地址。这意味着您可以从两个不同的入口点访问相同的元素。
在第二种情况下,您将使用新的内存地址创建相同的元素。这意味着ticketModels
与ticketModelsUpdated
没有共享相同的内存空间。
尽管ticketModelsUpdated
是局部变量,分配的内存将一直存在,直到引用该地址为止。因此,据我了解,即使ticketModels
被销毁后,ticketModelsUpdated
也应该有权访问所有元素。两种情况都应该起作用。
编辑:似乎您将适配器绑定到ticketModels
的引用,而不绑定到ticketModels
的值。这就是为什么您的方法ticketModels.clear()
会清除适配器已链接到的旧的已分配内存空间。因此,在第一种情况下,您将ticketModels
的链接更改为新的内存空间,而适配器仍引用已清除的内存空间。在第二种情况下,您保留对旧内存空间的引用,并在其中用新元素填充已清除的数据。
这只是我的猜测,因为您没有提供如何将适配器与ticketModels
绑定的任何信息。
答案 3 :(得分:0)
差异:
第一种情况:这种情况将ticketModelsUpdated的引用分配给ticketModels。因此,每当“ ticketModels”列表被修改时,“ ticketModelsUpdated”也将被修改。这就是为什么这种情况不起作用的原因。
第二种情况:这种情况仅将ticketModelsUpdated的值分配给ticketModels。因此,“ ticketModels”列表中的更改不会修改“ ticketModelsUpdated”列表。