仅获取hashmap arraylist中的最后一项数据

时间:2013-06-24 05:25:36

标签: android json hashmap

我已经解析了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)

1 个答案:

答案 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;
}

}