【问题标题】:Passing data from fragment to activity without affecting the fragment将数据从片段传递到活动而不影响片段
【发布时间】:2016-08-31 05:09:13
【问题描述】:

我有一个片段,我在其中生成一个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);
    ....
}

但是,我看到,每当对 MainActivity 中的 queueArrayList 进行任何更改时,片段中的 songArrayList 也会受到影响。如何阻止Fragment 中的ArrayList 被更改?

【问题讨论】:

标签: android android-fragments arraylist


【解决方案1】:

尝试以下方法。

this.queueArrayList.clear();
this.queueArrayList.addAll(songArrayList);

原因是您将 arraylist 直接引用到 queueArrayList,这也反映了 songArrayList 中的更改

【讨论】:

    【解决方案2】:

    使用接口传递该列表的引用,因此无论何时更改该列表也会影响片段列表。所以解决方案是创建一个新列表并复制它,而不是传递对该列表的引用。

    您可以尝试看看 Collections.copy 方法:

    public static void copy(List dest, List src)

    将一个列表中的所有元素复制到另一个列表中。操作后,目标列表中每个复制元素的索引将与其在源列表中的索引相同。目标列表必须至少与源列表一样长。如果它更长,则目标列表中的其余元素不受影响。此方法以线性时间运行。

    参数: dest - 目的地列表。 src - 源列表。

    希望对你有所帮助。

    【讨论】:

      【解决方案3】:

      这里是完整的解决方案: 在你的片段中调用 sendTheArraylist 之前-

      ArrayList<Song> songArrayListToPass= new ArrayList<Song>(songArrayList.size());
      Collections.copy(songArrayListToPass, songArrayList);
       YourActivityRef.sendTheArraylist(songArrayListToPass);
      

      这样,您在 Activity 中对 songArrayListToPass 的任何更新都不会反映在 Fragment 中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多