返回时Arraylist为空

时间:2012-06-26 11:10:25

标签: java android collections

我正在开发一个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,如

[[], [], [], [], []].

我无法理解为什么会发生这种情况请帮我解决这个问题。

感谢。

5 个答案:

答案 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引用...