我尝试使用SimpleAdapter显示我从Json解析到Listview的数据。
除了JsonArray中存在多个值的问题外,我可以显示所有数据。
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中的每个元素。谁知道什么是错的?
答案 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存储多个值,但在这种情况下,您将不得不采用类型为
的新hashmapHashMap<String, ArrayList<String>> map = new HashMap<>();
您将在哪里存储唯一ID“oid”作为键,值将是您的值jsonArray。