2016-09-26 55 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

相关问题