我有一个片段,其中我生成ArrayList
。生成ArrayList
后,我会使用界面将其发送到Activity
在我的片段中 -
public interface sendTheArraylist{
void ArrayList(ArrayList<Song> songArrayList);
}
在MainActivity中 -
@Override
public void accessArrayList(ArrayList<Song> songArrayList) {
this.queueArrayList=songArrayList;
queueAdapter =new SongAdapter(this,queueArrayList);
....
}
但是,我发现只要queueArrayList
MainActivity
中的songArrayList
发生任何更改,片段中的ArrayList
也会受到影响。如何阻止Fragment
中的Intent intent_to_ActivityB = new Intent(ActivityA.this,ActivityB.class);
startActivity(intent_to_ActivityB);
变更?
答案 0 :(得分:1)
尝试使用以下内容。
this.queueArrayList.clear();
this.queueArrayList.addAll(songArrayList);
原因是您直接将arraylist引用到queueArrayList,这也反映了songArrayList中的更改
答案 1 :(得分:0)
使用接口传递该列表的引用,因此每当您更改该列表时,也会影响片段列表。所以解决方案不是传递对该列表的引用而是创建一个新列表并复制它。
您可以尝试查看Collections.copy方法:
public static void copy(List dest,List src)
将一个列表中的所有元素复制到另一个列表中。在操作之后,目标列表中每个复制元素的索引将与源列表中的索引相同。目标列表必须至少与源列表一样长。如果它更长,则目标列表中的其余元素不受影响。此方法以线性时间运行。
参数:dest - 目的地列表。 src - 源列表。
希望它会对你有所帮助。答案 2 :(得分:0)
以下是完整的解决方案: 在调用sendTheArraylist之前你的片段 -
ArrayList<Song> songArrayListToPass= new ArrayList<Song>(songArrayList.size());
Collections.copy(songArrayListToPass, songArrayList);
YourActivityRef.sendTheArraylist(songArrayListToPass);
这样,您在Activity中的songArrayListToPass的任何更新都不会反映在Fragment中。