我正在开发一个Android项目,我遇到了一个问题,问题是:
当我退回时,Arraylist为空。
这是我的java代码:
ArrayList<ArrayList<Object>> container = new ArrayList<ArrayList<Object>>();
ArrayList<Object> itemRow = new ArrayList<Object>();
JSONObject jsonObj = new JSONObject(result);
JSONArray allElements = jsonObj.getJSONArray("Table");
Log.i("allElements", "" + allElements);
for (int i = 0; i < allElements.length(); i++) {
itemRow.add(allElements.getJSONObject(i).getString("ParentName").toString());
itemRow.add(allElements.getJSONObject(i).getString("ParentEmailID").toString());
itemRow.add(allElements.getJSONObject(i).getString("ParentContact").toString());
itemRow.add(allElements.getJSONObject(i).getString("ParentAddress").toString());
itemRow.add(allElements.getJSONObject(i).getString("ParentProfilePictureName").toString());
itemRow.add(allElements.getJSONObject(i).getString("StudentName").toString());
Log.i("itemRow", "itemRow at index: " + i + ", " + itemRow);
container.add(((i*2)/2), itemRow);
itemRow.clear();
}
return container;
在这段代码中,我有两个Arraylist用于包含所有元素,另一个用于存储单行元素。这些Arraylist是从JSONArray加载的,一切正常,我可以从项目行(Arraylist,单行)打印数据并存储到主Arraylist(容器)。
但是当我返回这个Arraylist(容器)并在logcat中打印时,它会显示空的Arraylist,如
[[], [], [], [], []].
我无法理解为什么会发生这种情况请帮我解决这个问题。
感谢。
答案 0 :(得分:6)
因为你做了,它仍然引用添加到container
itemRow.clear();
您可能想要重新初始化
itemRow = new ArrayList<Object>();
答案 1 :(得分:5)
停止清除列表,它不会再为空:
itemRow.clear();
您应该在每次迭代时创建一个新列表。将以下代码行放在for循环中:
ArrayList<Object> itemRow = new ArrayList<Object>();
请记住,Java传递对象的引用。因此容器列表包含对您添加到其中的列表的引用。它不会复制列表。因此,您当前的代码会将相同列表对象的多个引用添加到容器列表中,并在每次添加时清除列表。因此,它包含对循环结束时相同空列表的N个引用。
答案 2 :(得分:0)
您的评估具有误导性/错误,ArrayList 不为空,实际上包含五个元素。
数组列表的每个元素都是一个空列表。这是因为循环中的最后两行:
container.add(((i*2)/2), itemRow);
itemRow.clear();
第一行将itemRow添加到容器中,正如您所期望的那样。下一行会在您刚添加的行上调用clear()
- 因此,当您的方法退出时,容器中的所有内容都将为空。
看起来这个问题是由于您尝试在整个方法中重复使用相同的itemRow
对象而造成的,这不会起作用。要解决您的问题,请移动
ArrayList<Object> itemRow = new ArrayList<Object>();
循环中的构造函数(作为第一行),然后在结尾处停止调用clear()
。现在每个JSON元素都会为它创建一个单独的行列表,一旦你将它们添加到container
,它们就会保留它们的内容。
答案 3 :(得分:0)
您假设容器实际上复制了每个arraylist本身是不对的。它指的是那些已经创建的,而不是每个List的副本。
答案 4 :(得分:0)
试试这个
container.add(((i*2)/2), itemRow.clone());
关于JAVA引用...