2016-05-31 161 views
-2

我想填充一個可擴展的listview使用JSON數據,JSON父級顯示正常,但孩子數據是從每個孩子的所有數組重複,請參考我的代碼,我是如何做for循環我無法理解問題出在哪裏請幫助我的朋友。Json數組for循環

Please see the image attached image

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" 
     }] 
    }] 
}] 
+0

好,只是說你期待在列表中包含 –

+0

http://sampletemplates.net/yell4food/json/data_standard_item_ind_new.php?rname=standardtakeaway&id=2870對不起,我忘了張貼JSON先生 –

+0

在JSON兒童只包含兩個屬性,但它顯示的多屬性先生 –

回答

0

你的問題不是在循環,你的問題是,你忘了清除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_listArrayList,在這種情況下,每個ListViewch_list保存爲參考變量的元素這裏的問題發生了,由於Android在運行所有循環後,UI將在最後執行,它將顯示列表,並且它會發現所有列表都包含列表中的元素ch_list,因此它將在所有列表中顯示其中的項目,並且您甚至爲其添加值或每次迭代清除其值因此它將顯示第一種情況下的所有項目值,並且將僅顯示第二種情況下的最後一個項目值,所以這裏的問題必須通過單獨保存每個列表的值而不必改變它們來解決,然後執行時將使用這些預設值。

+0

不,先生重複其現在的工作只有一個項目即將先生 –

+0

你是什麼一個項目是什麼意思?!你的意思是每個列表只有一個項目?!如果是這樣,這個項目是什麼?! –

+0

更specfic其只給在陣列先生 –

0

試試吧!

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

         } 


        } 
+0

沒有它havnt工作和組名也現在 –