具有嵌套json解析的可扩展列表视图

时间:2015-10-30 10:25:48

标签: android json

我正在研究一个项目,我们必须在其中解析嵌套的json数组并将其显示在2级的可展开列表视图中,现在我只得到了第一项 组和他们的chield项目。我是Android开发新手请帮助我实现这一目标。我的代码在下面给出..

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;


import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ExpandableListView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupClickListener;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import android.widget.Toast;
public class MainActivity extends Activity {

    ExpandableListAdapter listAdapter;
    ExpandableListView expListView;
    List<String> listDataHeader;
    HashMap<String, List<String>> listDataChild;
    JSONObject obj,subObj;
    JSONArray subcatarray,jarray;
    private ProgressDialog pDialog;
    String cat_id="2";
    int j;
    JsonParser  jsonParser=new JsonParser();
    private static final String LOGIN_URL = "http://sion.in/kandly/services/serviceList.php?service=subcategory";

    private static final String TAG_SUCCESS = "status";
    private static final String TAG_MESSAGE = "message";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // get the listview
        expListView = (ExpandableListView) findViewById(R.id.lvExp);

        // preparing list data
        prepareListData();



        // Listview Group expanded listener
        expListView.setOnGroupExpandListener(new OnGroupExpandListener() {

            @Override
            public void onGroupExpand(int groupPosition) {
                Toast.makeText(getApplicationContext(),
                        listDataHeader.get(groupPosition) + " Expanded",
                        Toast.LENGTH_SHORT).show();
            }
        });

        // Listview Group collasped listener
        expListView.setOnGroupCollapseListener(new OnGroupCollapseListener() {

            @Override
            public void onGroupCollapse(int groupPosition) {
                Toast.makeText(getApplicationContext(),
                        listDataHeader.get(groupPosition) + " Collapsed",
                        Toast.LENGTH_SHORT).show();

            }
        });

        // Listview on child click listener
        expListView.setOnChildClickListener(new OnChildClickListener() {

            @Override
            public boolean onChildClick(ExpandableListView parent, View v,
                    int groupPosition, int childPosition, long id) {
                // TODO Auto-generated method stub
                Toast.makeText(
                        getApplicationContext(),
                        listDataHeader.get(groupPosition)
                                + " : "
                                + listDataChild.get(
                                        listDataHeader.get(groupPosition)).get(
                                        childPosition), Toast.LENGTH_SHORT)
                        .show();
                return false;
            }
        });
    }

    /*
     * Preparing the list data
     */
    private void prepareListData() {


        new Subcatagory().execute();
    }
    private class Subcatagory extends AsyncTask<String, String, String> {
        boolean failure = false;

        @Override
        protected void onPreExecute() {

            super.onPreExecute();

            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Please Wait..");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();

        }
        @Override
        protected String doInBackground(String... args) {
            // TODO Auto-generated method stub
            Boolean success;
            try {
                // Building Parameters
                listDataHeader = new ArrayList<String>();
                listDataChild = new HashMap<String, List<String>>();
                List<NameValuePair> params = new ArrayList<NameValuePair>();

                params.add(new BasicNameValuePair("cat_id", cat_id));
                Log.d("request!", "starting");

                //Posting user data to script 
                JSONObject json = jsonParser.makeHttpRequest(
                        LOGIN_URL, "POST", params);
                System.out.println("devjsondata"+json);

                jarray=json.getJSONArray("data");
                for(int i=0;i<=jarray.length();i++){
                    listDataHeader = new ArrayList<String>();
                    obj=jarray.getJSONObject(i);

                    listDataHeader.add(obj.getString("cat_name"));

                    subcatarray=obj.getJSONArray("product_details");

                    List<String> pSubItemArrayList = new ArrayList<String>();
                    for(j=0;j<=subcatarray.length();j++){

                        subObj=subcatarray.getJSONObject(j);

                        pSubItemArrayList.add(subObj.optString("product_name"));
                        listDataChild.put(listDataHeader.get(i), pSubItemArrayList);
                    }

                }

            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }
        protected void onPostExecute(String file_url) {
            // dismiss the dialog once product deleted
            pDialog.dismiss();

            listAdapter = new ExpandableListAdapter(MainActivity.this, listDataHeader, listDataChild);

            // setting list adapter
            expListView.setAdapter(listAdapter);

            // Listview Group click listener
            expListView.setOnGroupClickListener(new OnGroupClickListener() {

                @Override
                public boolean onGroupClick(ExpandableListView parent, View v,
                        int groupPosition, long id) {
                    // Toast.makeText(getApplicationContext(),
                    // "Group Clicked " + listDataHeader.get(groupPosition),
                    // Toast.LENGTH_SHORT).show();
                    return false;
                }
            });

        }
    }
}

我的适配器类是 -

public static class BasexpandableListAdapter extends BaseExpandableListAdapter{
    Context context;
    ArrayList<Product>ListTerbaru;
    ArrayList<ArrayList<SubCategory>> ListChildTerbaru;
    ArrayList<String>counterlist;
    //private int[] itemcounter=new int[ListChildTerbaru.size()];
    //final int count[] = {1};
    //String subcount;
    //SubCategory subcat;

    Boolean showText=false;
    public BasexpandableListAdapter (Context context, ArrayList<Product>ListTerbaru,ArrayList<ArrayList<SubCategory>> listChildXX){
        this.context=context;
        this.ListTerbaru=ListTerbaru;
        this.ListChildTerbaru=listChildXX;
        //      this.count=ListTerbaru.size();
        //      this.count=ListChildTerbaru.size();
    }

    @Override
    public boolean areAllItemsEnabled()
    {
        return true;
    }


    @Override
    public SubCategory getChild(int groupPosition, int childPosition) {
        return ListChildTerbaru.get(groupPosition).get(childPosition);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild,View convertView, ViewGroup parent) {

        final SubCategory childTerbaru = getChild(groupPosition, childPosition);

        final ViewHolder holder;
        View view = null;   
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.row_second, parent,false);
            //counter=0;
            totalValueOfCounter+=totalValueOfCounter;
            holder= new ViewHolder();
            holder.begdate1=(TextView)convertView.findViewById(R.id.textViewTitle);
            holder.countertext=(TextView)convertView.findViewById(R.id.countettext);
            holder.increament=(Button)convertView.findViewById(R.id.increment);
            holder.decrement=(Button)convertView.findViewById(R.id.decrement);

            holder.increament.setOnClickListener(new OnClickListener() {

                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    //int position = (Integer) v.getTag();

                        try{
                        counter = Integer.parseInt(holder.countertext.getText().toString().trim());
                        }catch(NumberFormatException e){

                        }
                        counter++; 

                        SubCategory element = (SubCategory)holder.increament.getTag(); 
                        element.setScore(Integer.toString(counter)); 
                        holder.countertext.setText(childTerbaru.getScore().trim());


                        //totalValueOfCounter=childTerbaru.getScore();
                         totaleamount.setText(totalValueOfCounter);
                        try{
                            totaleamount.setText(Double.toString(Double.parseDouble(childTerbaru.getItemPrice())*Double.parseDouble(childTerbaru.getScore())));
                            totalValueOfCounter=Double.toString(Double.parseDouble(childTerbaru.getItemPrice())*Double.parseDouble(childTerbaru.getScore()));

                        }catch(NumberFormatException e){

                        }

                    notifyDataSetChanged();
                }

            });
            holder.decrement.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub

                        try{
                            counter = Integer.parseInt(holder.countertext.getText().toString().trim());
                            }catch(NumberFormatException e){

                            }
                        if(counter>0){
                            counter--;
                        }       

                        SubCategory element = (SubCategory) holder.decrement.getTag(); 
                        element.setScore(Integer.toString(counter)); 
                        holder.countertext.setText(childTerbaru.getScore().trim());
                        //totalValueOfCounter=Integer.toString(counter);
                        //totalValueOfCounter
                        totaleamount.setText(totalValueOfCounter);
                        try{
                            totaleamount.setText(Double.toString(Double.parseDouble(childTerbaru.getItemPrice())*Double.parseDouble(childTerbaru.getScore())));
                            totalValueOfCounter=Double.toString(Double.parseDouble(childTerbaru.getItemPrice())*Double.parseDouble(childTerbaru.getScore()));

                        }catch(NumberFormatException e){

                    }
                    notifyDataSetChanged();
                }
            });
            holder.increament.setTag(childTerbaru);  
            holder.decrement.setTag(childTerbaru); 
            holder.countertext.setTag(childTerbaru); 
            holder.begdate1.setTag(childTerbaru); 

            convertView.setTag(holder);
            //holder.begdate1.setText(childTerbaru.getpSubCatName());
            //holder.countertext.setText(childTerbaru.getScore()); 
        }
        else{
            view = convertView; 
            ((ViewHolder) view.getTag()).countertext.setTag(childTerbaru); 
            ((ViewHolder) view.getTag()).increament.setTag(childTerbaru); 
            ((ViewHolder) view.getTag()).decrement.setTag(childTerbaru); 
            ((ViewHolder) view.getTag()).begdate1.setTag(childTerbaru); 
            holder=(ViewHolder)view.getTag();
            holder.begdate1.setText(childTerbaru.getpSubCatName());
            holder.countertext.setText(childTerbaru.getScore()); 

            return view;
          }
            holder.begdate1.setText(childTerbaru.getpSubCatName());
            holder.countertext.setText(childTerbaru.getScore()); 
        // holder.countertext.setText(Integer.toString(counter));
        //  holder.countertext.setText(ListChildTerbaru.get(groupPosition).get(childPosition).getScore()); 
        return convertView;
    }
    @Override
    public int getChildrenCount(int groupPosition) {
        return ListChildTerbaru.get(groupPosition).size();

    }

    @Override
    public Product getGroup(int groupPosition) {
        return ListTerbaru.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        return ListTerbaru.size();
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {

        Product terbaruModel = (Product) getGroup(groupPosition);
        ViewHolder holder= null;
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.row_first, parent,false);

            holder=new ViewHolder();
            holder.nama=(TextView)convertView.findViewById(R.id.textViewName);
            // holder.alamat=(TextView)convertView.findViewById(R.id.address);
            convertView.setTag(holder);

        }

        else{
            holder=(ViewHolder)convertView.getTag();
        }

        holder.nama.setText(terbaruModel.getpName());
        //holder.alamat.setText(terbaruModel.getAlamat());

        return convertView;
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    @Override
    public boolean isChildSelectable(int arg0, int arg1) {
        return true;
    }

    class ViewHolder{
        TextView begdate1,nama,countertext;
        Button increament,decrement;
    }

}

我的json回复是 -

{
"data": [
    {
        "status": "true",
        "message": "found",
        "cat_id": "24",
        "cat_name": "MEN",
        "product_details": [
            {
                "message": "found",
                "product_id": "17",
                "product_name": "irt",
                "price": "77.000000"
            },
            {
                "message": "found",
                "product_id": "22",
                "product_name": "sers",
                "price": null
            }
        ]
    },
    {
        "status": "true",
        "message": "fnd",
        "cat_id": "5",
        "cat_name": "WOMEN",
        "product_details": [
            {
                "message": "fod",
                "product_id": "17",
                "product_name": "irt",
                "price": "700"
            },
            {
                "message": "foud",
                "product_id": "7",
                "product_name": "Shrt",
                "price": "00"
            }
        ]
    }
]
}

1 个答案:

答案 0 :(得分:0)

将您的两个for循环中的条件从<=更改为<

我敢打赌你的日志中有 IndexOutOfBoundException 。在循环所有第一个项目的子项后,系统因此而退出循环。

他们应该是:

for( int i=0; i<jarray.length(); i++ )
for( int j=0; j<subcatarray.length() ;j++ )