2016-09-26 22 views
0

我試圖將我從Json解析的數據顯示到帶有SimpleAdapter的Listview中。Android JsonArray無法檢索所有值並在ListView中使用SimpleAdapter顯示

我可以顯示除JsonArray中的多個值存在問題之外的所有數據。

enter image description here

JSON數據

{ 
    "57": { 
    "Steak Doness": [ 
     "well done", 
     "medium", 
     "rare" 
    ] 
    }, 
    "58": { 
    "Size": [ 
     "small", 
     "medium", 
     "large", 
     "extra large" 
    ] 
    }, 
    "59": { 
    "Cooking Method": [ 
     "spicy", 
     "non-spicy" 
    ] 
    }, 
    "63": { 
    "Coldness": [ 
     "with ice", 
     "without ice" 
    ] 
    } 
} 

Java編碼

JSONObject jsonObject = new JSONObject(response); 
    String get_option_data=jsonObject.getString("option_data"); 
    JSONObject jsonObject1 = new JSONObject(get_option_data); 
    Iterator<String> iterator = jsonObject1.keys(); 
    while (iterator.hasNext()) { 

     String oid = iterator.next(); 
     String name_value=jsonObject1.getString(oid); 
     JSONObject jsonObject2=new JSONObject(name_value); 
     Iterator<String> iterator1 = jsonObject2.keys(); 

     while (iterator1.hasNext()) { 
      String name=iterator1.next(); 
      HashMap<String, String> map = new HashMap<>(); 
      map.put("oid",oid); 
      map.put("name",name); 
      JSONArray jsonArray=jsonObject2.getJSONArray(name); 
      int i; 
      for(i=0;i<jsonArray.length();i++){ 
       map.put("value",jsonArray.getString(i)); 
      } 
      aList.add(map); 
     } 
    } 
    String[] from = {"oid","name","value"}; 
    int[] to = {R.id.oid,R.id.name,R.id.value}; 
    SimpleAdapter adapter = new SimpleAdapter(option.this, aList, R.layout.option_template, from, to); 
    ListView listView = (ListView) findViewById(R.id.listview); 
    listView.setAdapter(adapter); 

正如你所看到的,它只能顯示JsonArray的最後一個元素,但不是每一個元素那個JsonArray。任何人都知道什麼是錯的?

回答

1

這裏你正在覆蓋hashmap的相同位置上的多個值。所以,你必須創建多個值無論是新的HashMap或傳輸的所有值逗號分隔成單個鍵

你的錯誤:

while (iterator1.hasNext()) { 
     String name=iterator1.next(); 
     HashMap<String, String> map = new HashMap<>(); 
     map.put("oid",oid); 
     map.put("name",name); 
     JSONArray jsonArray=jsonObject2.getJSONArray(name); 
     int i; 
     for(i=0;i<jsonArray.length();i++){ 
      map.put("value",jsonArray.getString(i)); 
     } 
     aList.add(map); 
    } 

解決方案:

while (iterator1.hasNext()) { 
     String name=iterator1.next(); 
     HashMap<String, String> map = new HashMap<>(); 
     map.put("oid",oid); 
     map.put("name",name); 
     JSONArray jsonArray=jsonObject2.getJSONArray(name); 
     int i; 
     String myValues = ""; 
     for(i=0;i<jsonArray.length();i++){ 
      if(myValues.equalsIgnoreCase("")) 
       myValues = jsonArray.getString(i); 
      else 
       myValues = myValues +","+jsonArray.getString(i); 
     } 
     map.put("value",myValues); 
     aList.add(map); 
    } 

在你的適配器可你會刪除此字符串並將創建新陣列

String[] values = "yourcommaseperatedValue".spilt(","); 

並顯示此代碼在Textview中的值列表像;

for(int i = 0 ; i < values.length(); i++){ 
    yourtextview.setText(values[i]+"\n"); 
} 

更好的辦法

你可以採取ArrayList中存儲多個值,但在這種情況下,你將不得不採取新的HashMap類型

HashMap<String, ArrayList<String>> map = new HashMap<>(); 

在那裏你將存儲你唯一的ID 「oid」作爲鍵和值將是你的值jsonArray。

+0

到目前爲止它工作正常。顯示所有元素。然後,對於「在你的adpater中,你必須使用split(」,「)創建數組並使用它。」你能爲這部分提供編碼嗎?由於所有的價值都粘在一起,沒有空間 – gosulove

+0

@gosulove:現在檢查 – Jai

+0

真棒!它現在正常工作thx – gosulove

2
for(i=0;i<jsonArray.length();i++){ 
    map.put("value",jsonArray.getString(i)); 
} 

你正在用相同的映射關鍵字替換兩個數組值,即value。在實際循環中,它將取代第一個值。您可以將數組值存儲在列表中,並將整個列表添加到地圖中。

ArrayList<String> values = new ArrayList<String>(); 
    for(int i=0;i<jsonArray.length();i++){ 
     values.add(jsonArray.getString(i)); 
    } 
    map.put("value", values; 

所有有剩下要做的就是使適配器結束一些微小的變化是通過遍歷它來顯示從列表中的值。

+0

?我沒有得到你,所以哪部分代碼應該改變? – gosulove

+1

因此,您將在地圖中替換相同的「值」鍵,最後一個值將存儲在地圖中。等待我更新我的答案。 – fluffyBatman

+0

@gosulove現在查看答案。 – fluffyBatman

相關問題