我有一个 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);
}
最佳答案
Activity
中 getStylesFromFile()
中的 return mStyles
返回对列表 mStyles
的引用,该列表是为什么两者指向同一个列表。
关于java - 为什么 addAll 会清除从中提取数据的 ArrayList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20665041/