1

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

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

我不明白为什么会发生这种情况,请帮我解决这个问题。

谢谢。

4

5 回答 5

6

因为你做了,它仍然指的是添加到的对象container

itemRow.clear();

您可能想重新初始化它

itemRow = new ArrayList<Object>();
于 2012-06-26T11:11:37.467 回答
5

停止清除列表,它不再为空:

itemRow.clear();

您应该在每次迭代时创建一个新列表。将以下代码行放入 for 循环中:

ArrayList<Object> itemRow = new ArrayList<Object>();

请记住,Java 传递对对象的引用。因此容器列表包含对您添加到其中的列表的引用。它不会复制列表。因此,您当前的代码将多个对同一列表对象的引用添加到容器列表中,并且每次添加时都会清除该列表。因此,它在循环结束时包含对同一个空列表的 N 个引用。

于 2012-06-26T11:12:59.933 回答
0

您的评估具有误导性/不正确,ArrayList为空,实际上包含五个元素。

数组列表的每个元素都是一个空列表。这是因为循环中的最后两行:

container.add(((i*2)/2), itemRow);
itemRow.clear();

如您所料,第一行将 itemRow 添加到容器中。下一行调用clear()您刚刚添加的行 - 因此在您的方法退出时容器中的所有内容都将始终为空

看起来这个问题是由于您试图在itemRow整个方法中重用相同的对象引起的,但这是行不通的。要解决您的问题,请将

ArrayList<Object> itemRow = new ArrayList<Object>();

循环内的构造函数(作为第一行),然后clear()在最后停止调用它。现在,每个 JSON 元素都将为其创建一个单独的行列表,一旦您将这些添加到其中,container它们将保持其内容。

于 2012-06-26T11:13:01.913 回答
0

您认为容器实际上复制每个数组列表本身的假设是不正确的。它指的是那些已经创建的而不是每个列表的副本。

于 2012-06-26T11:14:49.953 回答
0

试试这个

container.add(((i*2)/2), itemRow.clone());

因为它关于 JAVA 引用...

于 2012-06-26T11:17:03.680 回答