java - 为什么 addAll 会清除从中提取数据的 ArrayList?

标签 java android arraylist

我有一个 Fragment,将 ArrayList newStyles 发送到其 FragmentActivity mStyles,该 Fragment 被清除,然后使用 addAll 进行存储。我使用 .size() 来检查数组,并注意到在调用 addAll 后,源 newStyles 被清除:

以下内容将在调用 addAll 之前给出 newStyles 的正确大小,但在清除后给出 0 大小:

public void setStyles(ArrayList<String[][]> newStyles) {
    Log.d(TAG, "setStyles: mStyles.size() = " + mStyles.size());
    Log.d(TAG, "setStyles: newStyles.size() = " + newStyles.size());

    mStyles.clear();
    mStyles.addAll(newStyles);

    Log.d(TAG, "setStyles: mStyles.size() = " + mStyles.size());
    Log.d(TAG, "setStyles: newStyles.size() = " + newStyles.size());
}

最终发生的情况是两个 ArrayList 的大小最终都为 0。

更新

我用以下方法解决了这个问题:

mStyles = new ArrayList<String[][]>(newStyles);

但我仍然想知道发生了什么,所以这是必要的信息

以下内容在 Activity 中:

ArrayList<String[][]> mStyles;

protected void onCreate(Bundle savedInstanceState) {
...
mStyles = new ArrayList<String[][]>();
....
}

// Called by StylesFragment to preLoad styles from the file when
// the Fragment is viewed
public ArrayList<String[][]> getStylesFromFile() {

    mStyles.clear();
    mStyles.addAll(mTotalsFragment.getStyles());

    return mStyles;
}

// Called by StylesFragment when changes are made to styles
public void setStyles(ArrayList<String[][]> newStyles) {
    Log.d(TAG, "setStyles: mStyles.size() = " + mStyles.size());
    Log.d(TAG, "setStyles: newStyles.size() = " + newStyles.size());

    mStyles.clear();
    mStyles.addAll(newStyles);

    Log.d(TAG, "setStyles: mStyles.size() = " + mStyles.size());
    Log.d(TAG, "setStyles: newStyles.size() = " + newStyles.size());
}

以下是总计 fragment :

ArrayList<String[][]> mStyles;

public void onActivityCreated(Bundle savedInstanceState) {
...
mStyles = new ArrayList<String[][]>();
...
}

public void loadEstimate() {
...
// Do loop here to pull data from a file
mStyle = ...
...
}

// Called by StylesFragment via Activity
// to get Loaded data from file
public ArrayList<String[][]> getStyles() {

    return mStyles;
}

public void saveEstimate() {
...
// Get the styles that should be in Activity
mStyles = ((PagerActivityFragment)getActivity()).getStyles();

// Save the file with the new information
...
}

以下内容位于 StylesFragment 中:

ArrayList<String[][]> mStyles;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
mStyles = new ArrayList<String[][]>();
...
}

public void onResume() {
...
// Pull the styles loaded from the file through Activity
mStyles = ((PagerActivityFragment)getActivity()).getStylesFromFile();
...
}

public modifyStyle(stylePos) {
...
// Do some stuff here to modify a specific style (String[][]) within the ArryaList

// Now send changes back to Activity so TotalsFragment can pull it
// even if this Fragment is not available when file is to be saved
((PagerActivityFragment)getActivity()).setStyles(mStyles);
}

最佳答案

ActivitygetStylesFromFile() 中的 return mStyles 返回对列表 mStyles 的引用,该列表是为什么两者指向同一个列表。

关于java - 为什么 addAll 会清除从中提取数据的 ArrayList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20665041/

相关文章:

javascript - 如何使用 Nashorn 将 Javascript 对象从 Java 传递到 Javascript

java - JavaFX 2 小程序能否请求焦点并因此关注浏览器/选项卡?

android - 在 Android 12 上未收到 Firebase 推送通知

java - 在 Java 中显示类的内容时出现问题

java - 从数组列表中删除元素

java - 在数组列表上使用分隔符

java - Java LinkedList 会分配多少空间?

java - 线程 "main"java.lang.Error : Unresolved compilation problem: 中出现异常

java - 自定义注解Java/android

android - 更改图像的高度和宽度 - android