我已经解析了json数据,其中有一个主要的json数组,它包含子json数组。但主要的json数组在每个项目中都不包含子json数组。所以我已经解析了所有数据。我从中获得了完美的数据。但问题是主json数组数据显示在listview中,点击列表视图项后,子json数组显示为主json数组项,但它只从哈希映射数组列表中获取子json数组的最后一个元素。所以我无法正确显示,所以请找出一些标准的解决方案。
这是我的代码
public class MainCategories extends Fragment {
WebserviceClass wservice = new WebserviceClass();
Context c;
View v;
String data = "";
String User_id, countryid;
JSONObject jobj;
JSONArray datas;
int currentpage = 1;
ArrayList<HashMap<String, String>> dataList = new ArrayList<HashMap<String, String>>();
// testAdapter adapter
ArrayList<Allcategories> listing = new ArrayList<Allcategories>();;
public static ArrayList<subCateData> subList = new ArrayList<subCateData>();
int limit = 3, id;
Button bt1, bt2, bt3;
String img, img1;
String name, count;
String subname, subcount, subCategoryId;
View fragmentview;
ListView lv1, lv2, lv3;
JSONObject ca;
MainTest test;
String url, main, subnameData, subCountData, subID, cateGoryID;
LinearLayout ll;
ProgressDialog pDialog;
HashMap<String, String> map;
JSONArray dataa;
// SimpleAdapter adp;
Button b1, b2, b3;
public MainCategories(Context mainActivity, int id) {
// TODO Auto-generated constructor stub
this.c = mainActivity;
this.id = id;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
SharedPreferences sp = c.getSharedPreferences("key", 0);
User_id = sp.getString("userid=", User_id);
countryid = sp.getString("countryid", countryid);
v = inflater.inflate(R.layout.categories_tab, container, false);
lv2 = (ListView) v.findViewById(android.R.id.list);
if (FirstTab.adp == null) {
new CategoryTest().execute();
} else {
lv2.setAdapter(FirstTab.adp);
}
lv2.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
for (int i = 0; i < subList.size(); i++) {
subID = subList.get(i).getsubcatId();
subnameData = subList.get(i).getsubcatname();
subCountData = subList.get(i).getsubcatcount();
Log.v("ALLDATA", subnameData + "/" + "/" + "/"
+ subCountData);
}
String catid = listing.get(position).getCategoryid();
int mycatID = Integer.parseInt(catid);
Log.v("CAtegory ID", mycatID + "");
addfragment(new CategoriesListClick(c, subID, mycatID,
subnameData, subCountData, position), true,
FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
}
});
return v;
}
public class CategoryTest extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
url = String.format(Common.view_main_category + "country_id=%s",
countryid);
Log.v("CateGory URL:", url);
jobj = wservice.getjson(url);
return null;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
try {
JSONObject jdata = jobj.getJSONObject("data");
datas = jdata.getJSONArray("allcategories");
for (int i = 0; i < datas.length(); i++) {
Log.e("length", "" + datas.length());
ca = datas.getJSONObject(i);
cateGoryID = ca.getString("categoryid");
name = ca.getString("categoryname");
count = ca.getString("categorystorecount");
// map = new HashMap<String, String>();
// map.put("categoryname", name);
// map.put("categorystorecount", "(" + count + ")");
// String countc=c.getString("categoryid");
Log.e(name, count);
if (ca.has("subcategories")) {
dataa = ca.getJSONArray("subcategories");
for (int j = 0; j < dataa.length(); j++) {
JSONObject d = dataa.getJSONObject(j);
// subList = new ArrayList<subCateData>();
subCategoryId = d.getString("subcategoryid");
subname = d.getString("subcategoryname");
subcount = d.getString("subcategorystorecount");
// map.put("subcategoryid", subCategoryId);
// map.put("subcategoryname", subname);
// map.put("subcategorystorecount", "(" + subcount
// + ")");
subList.add(new subCateData(subCategoryId, subname,
subcount));
/*
* Log.v("This is Data for Sub:",
* map.get("subcategoryname").toString());
*/
}
} else {
System.out.println("JSONArray is null");
}
listing.add(new Allcategories(cateGoryID, name, count));
}
} catch (JSONException e) {
e.printStackTrace();
}
Log.v("Size", listing.size() + "");
FirstTab.adp = new MyCustom(c, listing);
lv2.setAdapter(FirstTab.adp);
}
}
void addfragment(Fragment fragment, boolean addBacktoStack, int transition) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.simple_fragment, fragment);
ft.setTransition(transition);
if (addBacktoStack)
ft.addToBackStack(null);
ft.commit();
}
class MyCustom extends BaseAdapter {
Context Mcontext;
ArrayList<Allcategories> thisCatList;
LayoutInflater inflater;
public MyCustom(Context c, ArrayList<Allcategories> listing) {
// TODO Auto-generated constructor stub
this.Mcontext = c;
this.thisCatList = listing;
inflater = LayoutInflater.from(Mcontext);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return thisCatList.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public View getView(int position, View v, ViewGroup parent) {
if (v == null) {
v = inflater.inflate(R.layout.list_categories, parent, false);
TextView catName = (TextView) v.findViewById(R.id.txtcname);
TextView catCount = (TextView) v.findViewById(R.id.txtccount);
catName.setText(thisCatList.get(position).getCategoryname());
catCount.setText("(" + ""
+ thisCatList.get(position).getCategorystorecount()
+ "" + ")");
Log.v("CatCount", catCount.getText().toString());
}
// TODO Auto-generated method stub
return v;
}
}
类AllCategories数据:
public class Allcategories {
private String arabicname;
private String categoryid;
private String categoryname;
private String categorystorecount;
private String fatherid;
private String order;
private String status;
// private List subcategories;
public Allcategories(String name, String count) {
// TODO Auto-generated constructor stub
this.categoryname = name;
this.categorystorecount = count;
}
public String getCategoryname() {
return this.categoryname;
}
public void setCategoryname(String categoryname) {
this.categoryname = categoryname;
}
public String getCategorystorecount() {
return this.categorystorecount;
}
public void setCategorystorecount(String categorystorecount) {
this.categorystorecount = categorystorecount;
}
SubCategory数据类:
public class subCateData {
String subcatId, subcategoryname, subcategorystorecount;
public subCateData(String id, String name, String count) {
// TODO Auto-generated constructor stub
this.subcatId = id;
this.subcategoryname = name;
this.subcategorystorecount = count;
}
public String getsubcatId() {
return this.subcatId;
}
public void setsubcatId(String subID) {
this.subcatId = subID;
}
public String getsubcatname() {
return this.subcategoryname;
}
public void setsubcatname(String name) {
this.subcategoryname = name;
}
public String getsubcatcount() {
return this.subcategorystorecount;
}
public void setsubcatcount(String count) {
this.subcategorystorecount = count;
}
这是我的Json解析网址:
http://www.sevenstarinfotech.com/projects/demo/okaz/API/view_categories.php?country_id=4
堆栈追踪:
06-27 12:23:34.361: V/ALLDATA(8533): High School///0
06-27 12:24:02.001: I/Adreno200-EGLSUB(8533): <ConfigWindowMatch:2218>: Format RGBA_8888.
06-27 12:24:02.011: D/memalloc(8533): /dev/pmem: Mapped buffer base:0x53153000 size:1536000 offset:0 fd:74
06-27 12:24:02.041: D/memalloc(8533): /dev/pmem: Mapped buffer base:0x54048000 size:15683584 offset:14147584 fd:80
06-27 12:24:02.091: D/OpenGLRenderer(8533): Flushing caches (mode 0)
06-27 12:24:02.111: D/memalloc(8533): /dev/pmem: Unmapping buffer base:0x51b26000 size:3072000 offset:1536000
06-27 12:24:02.121: D/memalloc(8533): /dev/pmem: Unmapping buffer base:0x552a2000 size:9093120 offset:7557120
06-27 12:24:02.121: D/memalloc(8533): /dev/pmem: Unmapping buffer base:0x55b4e000 size:17219584 offset:15683584
06-27 12:24:03.081: D/CLIPBOARD(8533): Hide Clipboard dialog at Starting input: finished by someone else... !
06-27 12:24:03.141: D/OpenGLRenderer(8533): Flushing caches (mode 0)
06-27 12:24:03.141: D/memalloc(8533): /dev/pmem: Unmapping buffer base:0x53153000 size:1536000 offset:0
06-27 12:24:03.141: D/memalloc(8533): /dev/pmem: Unmapping buffer base:0x54048000 size:15683584 offset:14147584
06-27 12:24:03.441: D/OpenGLRenderer(8533): Flushing caches (mode 2)
答案 0 :(得分:0)
你必须在当前的HasHMap中放入新的HashMap,这样你才能获得特定索引的子类别项。
请参阅this了解如何使用嵌套的HashMap?并在子类别循环中使用它。
我正在使用getter setter类的ArrayList来绑定数据。所以,如果你可以将你的代码转换成arraylist并编辑一个很棒的问题..
并参见下面的代码
import java.util.ArrayList;
public class MainCategories extends Fragment {
WebserviceClass wservice = new WebserviceClass();
Context c;
View v;
String data = "";
String User_id, countryid;
JSONObject jobj;
JSONArray datas;
int currentpage = 1;
ArrayList<HashMap<String, String>> dataList = new ArrayList<HashMap<String, String>>();
// testAdapter adapter
ArrayList<Allcategories> listing = new ArrayList<Allcategories>();;
public static ArrayList<subCateData> subList = new ArrayList<subCateData>();
int limit = 3, id;
Button bt1, bt2, bt3;
String img, img1;
String name, count;
String subname, subcount, subCategoryId;
View fragmentview;
ListView lv1, lv2, lv3;
JSONObject ca;
MainTest test;
String url, main, subnameData, subCountData, subID, cateGoryID;
LinearLayout ll;
ProgressDialog pDialog;
HashMap<String, String> map;
JSONArray dataa;
// SimpleAdapter adp;
Button b1, b2, b3;
/// sanket
ArrayList<Allcategories> list = new ArrayList<Allcategories>();
public MainCategories(Context mainActivity, int id) {
// TODO Auto-generated constructor stub
this.c = mainActivity;
this.id = id;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
SharedPreferences sp = c.getSharedPreferences("key", 0);
User_id = sp.getString("userid=", User_id);
countryid = sp.getString("countryid", countryid);
v = inflater.inflate(R.layout.categories_tab, container, false);
lv2 = (ListView) v.findViewById(android.R.id.list);
if (FirstTab.adp == null) {
new CategoryTest().execute();
} else {
lv2.setAdapter(FirstTab.adp);
}
lv2.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
for (int i = 0; i < subList.size(); i++) {
subID = list.get(position).get(i).getList().getsubcatId();
subnameData = list.get(position).get(i).getList().getsubcatname();
subCountData = list.get(position).get(i).getList().getsubcatcount();
Log.v("ALLDATA", subnameData + "/" + "/" + "/"
+ subCountData);
}
String catid = listing.get(position).getCategoryid();
int mycatID = Integer.parseInt(catid);
Log.v("CAtegory ID", mycatID + "");
addfragment(new CategoriesListClick(c, subID, mycatID,
subnameData, subCountData, position), true,
FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
}
});
return v;
}
public class CategoryTest extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
url = String.format(Common.view_main_category + "country_id=%s",
countryid);
Log.v("CateGory URL:", url);
jobj = wservice.getjson(url);
return null;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
try {
JSONObject jdata = jobj.getJSONObject("data");
datas = jdata.getJSONArray("allcategories");
for (int i = 0; i < datas.length(); i++) {
// sanket
Allcategories binAll = new Allcategories();
Log.e("length", "" + datas.length());
ca = datas.getJSONObject(i);
cateGoryID = ca.getString("categoryid");
name = ca.getString("categoryname");
count = ca.getString("categorystorecount");
// map = new HashMap<String, String>();
// map.put("categoryname", name);
// map.put("categorystorecount", "(" + count + ")");
// String countc=c.getString("categoryid");
//sanket
binAll.setcategoryid(cateGoryID);
binAll.setcategoryname(name);
binAll.setcategorystorecount(count);
Log.e(name, count);
if (ca.has("subcategories")) {
dataa = ca.getJSONArray("subcategories");
for (int j = 0; j < dataa.length(); j++) {
JSONObject d = dataa.getJSONObject(j);
// subList = new ArrayList<subCateData>();
subCategoryId = d.getString("subcategoryid");
subname = d.getString("subcategoryname");
subcount = d.getString("subcategorystorecount");
// map.put("subcategoryid", subCategoryId);
// map.put("subcategoryname", subname);
// map.put("subcategorystorecount", "(" + subcount
// + ")");
//// sanket
ArrayList<subCateData> sublist = new ArrayList<subCateData>();
subCateData binSub = new subCateData();
binSub.setsubcatId(subCategoryId);
binSub.setsubcatname(subname);
binSub.setsubcatcount(subcount);
subList.add(new subCateData(subCategoryId, subname,
subcount));
/*
* Log.v("This is Data for Sub:",
* map.get("subcategoryname").toString());
*/
sublist.add(binSub);
}
/// sanket note : make arraylist of subdata in Allcategories class and generate getter and settter
binAll.setList(sublist);
} else {
System.out.println("JSONArray is null");
}
listing.add(new Allcategories(cateGoryID, name, count));
list.add(binAll);
}
} catch (JSONException e) {
e.printStackTrace();
}
Log.v("Size", listing.size() + "");
FirstTab.adp = new MyCustom(c, listing);
lv2.setAdapter(FirstTab.adp);
}
}
void addfragment(Fragment fragment, boolean addBacktoStack, int transition) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.simple_fragment, fragment);
ft.setTransition(transition);
if (addBacktoStack)
ft.addToBackStack(null);
ft.commit();
}
class MyCustom extends BaseAdapter {
Context Mcontext;
ArrayList<Allcategories> thisCatList;
LayoutInflater inflater;
public MyCustom(Context c, ArrayList<Allcategories> listing) {
// TODO Auto-generated constructor stub
this.Mcontext = c;
this.thisCatList = listing;
inflater = LayoutInflater.from(Mcontext);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return thisCatList.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public View getView(int position, View v, ViewGroup parent) {
if (v == null) {
v = inflater.inflate(R.layout.list_categories, parent, false);
TextView catName = (TextView) v.findViewById(R.id.txtcname);
TextView catCount = (TextView) v.findViewById(R.id.txtccount);
catName.setText(thisCatList.get(position).getCategoryname());
catCount.setText("(" + ""
+ thisCatList.get(position).getCategorystorecount()
+ "" + ")");
Log.v("CatCount", catCount.getText().toString());
}
// TODO Auto-generated method stub
return v;
}
}