Android JsonArray无法检索所有值并使用SimpleAdapter在Listview中显示

时间:2016-09-26 06:44:11

标签: android json listview

我尝试使用SimpleAdapter显示我从Json解析到Listview的数据。

除了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中的每个元素。谁知道什么是错的?

2 个答案:

答案 0 :(得分: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;

剩下要做的就是在适配器端做一些小改动,通过迭代来显示列表中的值。

答案 1 :(得分: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);
    }

在您的adpater中,您将删除此字符串并创建新数组

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

在Textview Like中显示此值数组;

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。