【问题标题】:Json Array for loop用于循环的 Json 数组
【发布时间】:2016-05-31 07:49:56
【问题描述】:

我正在尝试使用 json 数据填充可扩展列表视图,json 父级显示正确,但子级数据从每个子级的所有数组中重复,请参考我的代码,这就是我执行 for 循环的方式不明白问题出在哪里,请朋友们帮帮我。

ExpandListdata.java

private void loaditems() {
        String url = Constant.commonurlyell + "data_standard_item_ind_new.php?rname=standardtakeaway&id=" + item;
        Log.d("ITems", url);
        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("Loading...");
        progressDialog.show();
        JsonArrayRequest arrayRequest = new JsonArrayRequest(Request.Method.GET, url, (String) null, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                ArrayList<Subitem_base> list = new ArrayList<Subitem_base>();
                ArrayList<Subitem_base_child> ch_list = new ArrayList<Subitem_base_child>();
                try {
                    for (int i = 0; i < response.length(); i++) {
                        JSONObject baseobj = response.getJSONObject(i);
                        JSONArray itemarry = baseobj.getJSONArray("items");
                        for (int k = 0; k < itemarry.length(); k++) {
                            JSONObject itmobj = itemarry.getJSONObject(k);
                            Subitem_base subitems = new Subitem_base();
                            subitems.setGroupitemname(itmobj.getString("BaseName"));
                            JSONArray subitemschildarray = itmobj.getJSONArray("subitems");
                            for (int j = 0; j < subitemschildarray.length(); j++) {
                                JSONObject subiteobj = subitemschildarray.getJSONObject(j);
                                Subitem_base_child subitembase = new Subitem_base_child();
                                subitembase.setChilditemname(subiteobj.getString("SubItemdesc"));
                                ch_list.add(subitembase);
                            }
                            subitems.setItems(ch_list);
                            list.add(subitems);
                        }
                    }

                    SubItem_ExpandAdapter subexpand = new SubItem_ExpandAdapter(getApplicationContext(), list);
                    sec.setAdapter(subexpand);
                    subexpand.notifyDataSetChanged();
                    progressDialog.hide();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                progressDialog.dismiss();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d("SecondleveError", String.valueOf(error));
            }
        });
        arrayRequest.setRetryPolicy(new DefaultRetryPolicy(50000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        AppController.getInstance().addToRequestQueue(arrayRequest);

以下是我的 JSON 数据:

[{
    "menu_name": "Beverages",
    "items": [{
        "id": 1,
        "BaseName": "Coca-Cola",
        "itemdesc": "",
        "subitems": [{
            "id": 1,
            "SubItemdesc": "0.33L",
            "SubItemprice": "0.90"
        },
        {
            "id": 2,
            "SubItemdesc": "1.5L",
            "SubItemprice": "2.00"
        }]
    },
    {
        "id": 2,
        "BaseName": "Diet Coca-Cola",
        "itemdesc": "",
        "subitems": [{
            "id": 1,
            "SubItemdesc": "0.33L",
            "SubItemprice": "0.90"
        },
        {
            "id": 2,
            "SubItemdesc": "1.5L",
            "SubItemprice": "2.00"
        }]
    },
    {
        "id": 3,
        "BaseName": "Fanta",
        "itemdesc": "",
        "subitems": [{
            "id": 1,
            "SubItemdesc": "0.33L",
            "SubItemprice": "0.90"
        }]
    },
    {
        "id": 4,
        "BaseName": "Tango",
        "itemdesc": "",
        "subitems": [{
            "id": 1,
            "SubItemdesc": "0.33L",
            "SubItemprice": "0.90"
        }]
    }]
}]

【问题讨论】:

  • 好吧,请说出您希望列表包含的内容
  • sampletemplates.net/yell4food/json/… 抱歉,我忘记发 JSon 先生了
  • 在 JSON Child 中仅包含两个属性,但它显示多个属性先生

标签: java android json for-loop


【解决方案1】:

你的问题不在循环中,你的问题是你每次都忘记清除ch_list,所以在旧物品的基础上放了新物品,如果你清除了它就没有效率工作,因为它将通过引用传递,因此您将只有最后一个元素项目,因此要解决您的问题,您必须声明一个 Map 它将保存每个项目的所有 ch_list 元素,然后您将使用地图编号:

                // here we declare the Map before the "k" for loop        
                Map<Integer, ArrayList<Subitem_base_child>> ch_lists = new HashMap<Integer, ArrayList<Subitem_base_child>>();
                for (int k = 0; k < itemarry.length(); k++) {
                    ch_list = new ArrayList<Subitem_base_child>(); // here is the trick
                    JSONObject itmobj = itemarry.getJSONObject(k);
                    Subitem_base subitems = new Subitem_base();
                    subitems.setGroupitemname(itmobj.getString("BaseName"));
                    JSONArray subitemschildarray = itmobj.getJSONArray("subitems");
                    for (int j = 0; j < subitemschildarray.length(); j++) {
                        JSONObject subiteobj = subitemschildarray.getJSONObject(j);
                        Subitem_base_child subitembase = new Subitem_base_child();
                        subitembase.setChilditemname(subiteobj.getString("SubItemdesc"));
                        ch_list.add(subitembase);
                    }
                    ch_lists.put(k, ch_list);
                    subitems.setItems(ch_lists.get(k));
                    list.add(subitems);
                }

如果问题仍然存在,只需对 list ArrayList 执行相同操作即可。


说明:

当您将ch_list 直接作为ArrayList 传递时发生了这里的问题,在这种情况下,每个ListView 都会将ch_list 保存为元素的引用变量,并且将执行android UI在运行完所有循环后,它会显示列表,它会发现所有列表都有列表中的元素 ch_list 所以它会在所有列表中显示其中的项目,并且你甚至不断添加值到它或在循环中的每次迭代中清除其值,因此它将在第一种情况下显示所有项目值,在第二种情况下仅显示最后一个项目值,因此必须通过保存值来解决这里的问题每个列表单独进行而无需更改它们,然后在执行时将使用这些预先保存的值。

【讨论】:

  • 你说的一项是什么意思?!!你的意思是每个列表只有一个项目?!如果是这样,这个项目是什么?!!
  • 它更具体,它只给出数组中的第一个元素,sir
  • 谢谢兄弟,如果可能的话,它就像魅力一样,你能解释一下你是怎么做到的,我是从 youtube 学到的 android 开发新手,再次感谢
  • 我很高兴能帮助您解决问题,请锁定我答案末尾的新解释。
【解决方案2】:

试试看!!!

 Subitem_base  subitems == null;
 for (int k = 0; k < itemarry.length(); k++) {
                        JSONObject itmobj = itemarry.getJSONObject(k);
                        subitems = new Subitem_base();
                           subitems.setGroupitemname(itmobj.getString("BaseName"));
                        JSONArray subitemschildarray = itmobj.getJSONArray("subitems");

 Subitem_base_child subitembase == null;
                        for (int j = 0; j < subitemschildarray.length(); j++) {
                            JSONObject subiteobj = subitemschildarray.getJSONObject(j);
                            subitembase = new Subitem_base_child();
                            subitembase.setChilditemname(subiteobj.getString("SubItemdesc"));
                            ch_list.add(subitembase); 
                            subitems.setItems(ch_list);
                            list.add(subitems);

                        }


                    }

【讨论】:

  • 不,它没有工作,组名现在也在重复
猜你喜欢
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 2013-05-28
相关资源
最近更新 更多