Java 循环的Json数组

Java 循环的Json数组,java,android,json,for-loop,Java,Android,Json,For Loop,我正在尝试使用json数据填充一个可扩展的listview,json父级正确显示,但子级数据在每个子级中的所有数组中重复,请参考我的代码,这就是我如何执行for循环的方法。我无法理解问题出在何处。请帮助我解决朋友们 ExpandListdata.java private void loaditems() { String url = Constant.commonurlyell + "data_standard_item_ind_new.php?rname=standardtak

我正在尝试使用json数据填充一个可扩展的listview,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);
试试看

 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);

                        }


                    }

你的问题不在循环中,你的问题是你每次都忘了清除Chu列表,因此新项目是在旧项目的基础上添加的,如果你清除了它,它将无法有效工作,因为它将通过引用传递,因此你将只拥有最后一个元素项目,因此,为了解决您的问题,您必须声明一个映射,该映射将保存每个项目的所有Chu列表元素,然后您将按id使用映射:

                // 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执行相同的操作

说明:


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

,只需说出您希望列表包含的内容抱歉,我忘了发布JSon sirin。JSon子项仅包含两个属性,但它显示了多个属性sirno它没有工作,groupname现在也在重复您所说的一项是什么意思?!!你是说每个列表只有一个项目?!!如果是这样,这是什么东西?!!更特别的是,它是数组中唯一的第一个元素,Sirbro,谢谢,它很有魅力,如果可能的话,你能解释一下你是怎么做到的吗?我是android开发的新手,再次从youtube上学到了很多东西。谢谢,我真的很高兴我能帮你解决问题,请锁定我答案末尾的新解释。
                // 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);
                }