1

私はアンドロイドプロジェクトに取り組んでおり、問題に直面しています。問題は次のとおりです。

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 を 2 つ用意しています。これらの 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

コンテナが実際にすべての配列リスト自体をコピーするというあなたの仮定は正しくありません。各リストのコピーを持っているのではなく、すでに作成されているものを指します。

于 2012-06-26T11:14:49.953 に答える
0

これを試して

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

JAVA参照について...

于 2012-06-26T11:17:03.680 に答える
0

あなたの評価は誤解を招く/正しくありません。ArrayList は空ではなく、実際には 5 つの要素が含まれています。

配列リストの各要素は空のリストです。これは、ループ内の最後の 2 行が原因です。

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 に答える