1

リモート サーバーからのデータを使用して展開可能なリストビューを実装しようとしています。JSON の部分については既に説明しました。私のサンプルには 3 つの値セットが返されています (元の JSON 応答で logcat をチェックすることで確認できます)。私の問題は、JSON の戻り値をヘッダーと子データに分割しているときに、最初の値セットがスキップされることです。私のコードは次のとおりです。

int lisDataHeaderCounter = 0;
String searchKey;

for (int i = 0; i < components.length(); i++) {                     
    List<String> component_value = new ArrayList<String>();

    searchKey = main_components.get(i);
    if (!listDataHeader.contains(searchKey)) {
        listDataHeader.add(searchKey);

        Iterator<Map.Entry<String, String>> entries = sub_components.entrySet().iterator(); 

        while (entries.hasNext()) {
            Map.Entry<String, String> entry = entries.next();

            Log.d("getValue() ", "+ " + entry.getValue());
            if (searchKey == entry.getKey())
                component_value.add(entry.getValue());
        }

        listDataChild.put(listDataHeader.get(lisDataHeaderCounter), component_value);
        lisDataHeaderCounter++;
    }                       
}

以下のコードも試しましたが、それでも同じ結果が得られます。

for (Map.Entry<String, String> entry : sub_components.entrySet()) {
    if (searchKey == entry.getKey())
        component_value.add(entry.getValue());
}

上記のコードで処理されている JSON 応答のサンプルを次に示します。

[{"activity_code":"1","activity_name":"Midterm Exam"},
 {"activity_code":"1","activity_name":"Final Exam"},
 {"activity_code":"2","activity_name":"Project"}]

現在のコードでは、for ループで、searchKey の最初の値は「1」です。Log.d(); を配置したとき 最初の値が何を読み取ったかを確認するwhileループで、「中間試験」ではなく「期末試験」であることがわかりました。while ループに入る前に最初のデータ セットの値を取得する方法はありますか?

これは、最初の値が sub_components に含まれるようにするために私が行った回避策です。でも綺麗に見えないと思います。誰かがより良い解決策を持っている場合は、お気軽に共有してください。

for (int i = 0; i < components.length(); i++) {
    JSONObject c = components.getJSONObject(i);

    String formula_code = c.getString(TAG_FORMULA_CODE);
    String component_name = c.getString(TAG_ACTIVITY_NAME);

    main_components.add(formula_code);
    sub_components.put(formula_code, component_name);

    if (!listDataHeader.contains(formula_code))
        listDataHeader.add(formula_code);
    if (i == 0) {
        component_value.add(component_name);
    }
}

for (int i = 0; i < listDataHeader.size(); i++) {
    for (Map.Entry<String, String> entry : sub_components.entrySet()) {
        if (listDataHeader.get(i) == entry.getKey())
            component_value.add(entry.getValue());
    }

    listDataChild.put(listDataHeader.get(i), component_value);
    component_value = new ArrayList<String>();
}
4

1 に答える 1