为什么 addAll 清除 ArrayList 从中提取数据



我有一个片段将ArrayListnewStyles发送到其FragmentActivity,mStyles,清除然后使用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);

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

以下是活动:

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());
}

以下是总计片段中的内容:

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这就是两者指向同一列表的原因。

最新更新