Java 循环的Json数组
我正在尝试使用json数据填充一个可扩展的listview,json父级正确显示,但子级数据在每个子级中的所有数组中重复,请参考我的代码,这就是我如何执行for循环的方法。我无法理解问题出在何处。请帮助我解决朋友们 ExpandListdata.javaJava 循环的Json数组,java,android,json,for-loop,Java,Android,Json,For Loop,我正在尝试使用json数据填充一个可扩展的listview,json父级正确显示,但子级数据在每个子级中的所有数组中重复,请参考我的代码,这就是我如何执行for循环的方法。我无法理解问题出在何处。请帮助我解决朋友们 ExpandListdata.java private void loaditems() { String url = Constant.commonurlyell + "data_standard_item_ind_new.php?rname=standardtak
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);
试试看
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);
}
}
你的问题不在循环中,你的问题是你每次都忘了清除Chu列表,因此新项目是在旧项目的基础上添加的,如果你清除了它,它将无法有效工作,因为它将通过引用传递,因此你将只拥有最后一个元素项目,因此,为了解决您的问题,您必须声明一个映射,该映射将保存每个项目的所有Chu列表元素,然后您将按id使用映射:
// 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执行相同的操作
说明:
这里的问题发生在您将Chu列表直接作为ArrayList传递时,在这种情况下,每个ListView都会将Chu列表保存为元素的引用变量,并且由于android UI将在运行所有循环后最后执行,它将显示列表,它将发现所有列表都有列表中的元素,因此它将在所有列表中显示其中的项目,甚至在循环中的每次迭代中,您都会不断向列表添加值或清除其值,因此,在第一种情况下,它将显示所有项目值,而在第二种情况下,它将仅显示最后一个项目值,因此,这里的问题必须通过单独保存每个列表的值而不更改它们来解决,然后在执行时,它将使用这些预先保存的值。,只需说出您希望列表包含的内容抱歉,我忘了发布JSon sirin。JSon子项仅包含两个属性,但它显示了多个属性sirno它没有工作,groupname现在也在重复您所说的一项是什么意思?!!你是说每个列表只有一个项目?!!如果是这样,这是什么东西?!!更特别的是,它是数组中唯一的第一个元素,Sirbro,谢谢,它很有魅力,如果可能的话,你能解释一下你是怎么做到的吗?我是android开发的新手,再次从youtube上学到了很多东西。谢谢,我真的很高兴我能帮你解决问题,请锁定我答案末尾的新解释。
// 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);
}