how to make ExpandableListView with JSON array

android, expandablelistview, java, json

Solution

Modify your adapter

 public class TerbaruAdapter extends BaseExpandableListAdapter{
    Context context;
    ArrayList<TerbaruModel>ListTerbaru;
    ArrayList<ArrayList<ChildTerbaru>> ListChildTerbaru;
    int count;

    public TerbaruAdapter (Context context, ArrayList<TerbaruModel>ListTerbaru,ArrayList<ArrayList<ChildTerbaru>> ListChildTerbaru){
        this.context=context;
        this.ListTerbaru=ListTerbaru;
        this.ListChildTerbaru=ListChildTerbaru;
//      this.count=ListTerbaru.size();
//      this.count=ListChildTerbaru.size();
    }
    @Override
    public boolean areAllItemsEnabled()
    {
        return true;
    }


    @Override
    public ChildTerbaru 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(int groupPosition, int childPosition, boolean isLastChild,View convertView, ViewGroup parent) {

        ChildTerbaru childTerbaru = getChild(groupPosition, childPosition);
        ViewHolder holder= null;

        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.expandablelistview_child, null);

            holder=new ViewHolder();
            holder.begdate1=(TextView)convertView.findViewById(R.id.beg_date);
            holder.enddate1=(TextView)convertView.findViewById(R.id.end_date);
            convertView.setTag(holder);

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

        holder.begdate1.setText(childTerbaru.getBegDate());
        holder.enddate1.setText(childTerbaru.getEndDate());

        return convertView;
    }
    @Override
    public int getChildrenCount(int groupPosition) {
        return ListChildTerbaru.get(groupPosition).size();
    }

    @Override
    public TerbaruModel 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) {

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

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

        }

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

        holder.nama.setText(terbaruModel.getNama());
        holder.alamat.setText(terbaruModel.getAlamat());

         return convertView;
    }

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

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


    static class ViewHolder{
        TextView begdate1, enddate1,nama, alamat, imageid;
    }

}

And your activity

public class TerbaruSimasCard extends Activity {

    private ProgressDialog dialog;
    private ArrayList<TerbaruModel> ListTerbaru =  null;
    private ArrayList<ChildTerbaru> ListChildTerbaru =  null;
    private ArrayList<ArrayList<ChildTerbaru>> ListChildXXXXXXXXX = null;
    ListView list;
    String phone1, begdate1, enddate1, img_id1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.sample);
        ListTerbaru = new ArrayList<TerbaruModel>();
        ListChildTerbaru = new ArrayList<ChildTerbaru>();//ArrayList<ArrayList<ChildTerbaru>>>();
        ListChildXXXXXXXXX = new ArrayList<ArrayList<ChildTerbaru>>();
        new TerbaruAsyncTask().execute();
    }

    public class TerbaruAsyncTask extends AsyncTask<Void, Void, String> {
        String url = ("http:www.domain.com/123");

        public TerbaruAsyncTask() {
            this.url = url;
        }

        protected void onPreExecute() {
            super.onPreExecute();
            dialog = ProgressDialog.show(TerbaruSimasCard.this, "",
                    "melakukan pengambilan data...");
        }

        @Override
        protected String doInBackground(Void... params) {
            String result = "";
            try {
                result = Connection.get(url);
            } catch (Exception e) {
                result = "";
                Log.d("test", e.getMessage());
            }
            return result;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            fetchResponse(result.replace("\n", "").trim());
            dialog.dismiss();
        }

    }

    private void fetchResponse(String result) {
        if (!result.equals("")) {
            try {
                JSONArray jsonArray = new JSONArray(result);
                TerbaruModel LT = null;
                ChildTerbaru CT = null;
                for (int i = 0; i < jsonArray.length(); i++) {
                    ListChildTerbaru = new ArrayList<ChildTerbaru>();
                    JSONObject jsonObject = jsonArray.getJSONObject(i);

                    LT = new TerbaruModel(jsonObject.optString("img_id"),
                            jsonObject.optString("nama"),
                            jsonObject.optString("alamat"));
                    ListTerbaru.add(LT);

                    //for (int j = 0; j < jsonArray.length(); j++) {
                        CT = new ChildTerbaru(jsonObject.optString("begdate"),
                                jsonObject.optString("enddate"));
                        ListChildTerbaru.add(CT);//get(i).get(i).add(CT);

                    //}
                        ListChildXXXXXXXXX.add(ListChildTerbaru);
                    ExpandableListView list = (ExpandableListView) findViewById(R.id.expandablelistView);

                    TerbaruAdapter adapter = new TerbaruAdapter(this,ListTerbaru, ListChildXXXXXXXXX);
                    list.setAdapter(adapter);

                }

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

Problem

I want to make an ExpandableListView, which gets data from a response from server(JSON array) for its groups and their children. this is my json : ``` [ { " "begdate": "23/07/2013", "nama": "OPTIK INTERNASIONAL", "img_id": 2, "alamat": "Jl. Nasional No 23 Meulaboh", "enddate": "23/07/2015", }, { "begdate": "01/05/2013", "nama": "EL JOHN SMOKING LOUNGE", "img_id": 3, "alamat": "Bandara Sultan Iskandar Muda, Banda Aceh", "enddate": "30/04/2014", }, { "begdate": "09/11/2012", "nama": "ESPRESSO COFFE", "img_id": 2 "alamat": "JL. SOEKARNO HATTA No. 16-17, Simpang Dodi", "enddate": "09/11/2014", }, { "begdate": "16/03/2012", "nama": "LUZI PERFUME", "img_id": 3, "alamat": "JL. MATA IE KETAPANG II", "enddate": "16/03/2014", } ] ``` "alamat" and nama" will become groups, "begdate" and "enddate" will become their children. i have follow tutorial from here : http://en.wikicode.org/index.php/Custom_ExpandableListView but when i implement it, i got error is there any wrong with my code? this is my logcat : ``` 08-16 15:18:34.541: E/AndroidRuntime(416): FATAL EXCEPTION: main 08-16 15:18:34.541: E/AndroidRuntime(416): java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0 08-16 15:18:34.541: E/AndroidRuntime(416): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257) 08-16 15:18:34.541: E/AndroidRuntime(416): at java.util.ArrayList.get(ArrayList.java:311) 08-16 15:18:34.541: E/AndroidRuntime(416): at com.example.belajaraccordion.TerbaruSimasCard.fetchResponse(TerbaruSimasCard.java:106) 08-16 15:18:34.541: E/AndroidRuntime(416): at com.example.belajaraccordion.TerbaruSimasCard.access$1(TerbaruSimasCard.java:85) 08-16 15:18:34.541: E/AndroidRuntime(416): at com.example.belajaraccordion.TerbaruSimasCard$TerbaruAsyncTask.onPostExecute(TerbaruSimasCard.java:77) 08-16 15:18:34.541: E/AndroidRuntime(416): at com.example.belajaraccordion.TerbaruSimasCard$TerbaruAsyncTask.onPostExecute(TerbaruSimasCard.java:1) 08-16 15:18:34.541: E/AndroidRuntime(416): at android.os.AsyncTask.finish(AsyncTask.java:417) 08-16 15:18:34.541: E/AndroidRuntime(416): at android.os.AsyncTask.access$300(AsyncTask.java:127) 08-16 15:18:34.541: E/AndroidRuntime(416): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) 08-16 15:18:34.541: E/AndroidRuntime(416): at android.os.Handler.dispatchMessage(Handler.java:99) 08-16 15:18:34.541: E/AndroidRuntime(416): at android.os.Looper.loop(Looper.java:123) 08-16 15:18:34.541: E/AndroidRuntime(416): at android.app.ActivityThread.main(ActivityThread.java:3683) 08-16 15:18:34.541: E/AndroidRuntime(416): at java.lang.reflect.Method.invokeNative(Native Method) 08-16 15:18:34.541: E/AndroidRuntime(416): at java.lang.reflect.Method.invoke(Method.java:507) 08-16 15:18:34.541: E/AndroidRuntime(416): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 08-16 15:18:34.541: E/AndroidRuntime(416): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 08-16 15:18:34.541: E/AndroidRuntime(416): at dalvik.system.NativeStart.main(Native Method) ``` this is my code : TerbaruSimasCard.java ``` public class TerbaruSimasCard extends Activity { private ProgressDialog dialog; private ArrayList<TerbaruModel>ListTerbaru; private ArrayList<ArrayList<ArrayList<ChildTerbaru>>> ListChildTerbaru; ListView list; String phone1, begdate1, enddate1,img_id1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.terbarusimascard); ListTerbaru= new ArrayList<TerbaruModel>(); ListChildTerbaru= new ArrayList<ArrayList<ArrayList<ChildTerbaru>>>(); new TerbaruAsyncTask().execute(); } public class TerbaruAsyncTask extends AsyncTask<Void, Void, String> { String url = ("http://www.domain.com/123"); public TerbaruAsyncTask() { this.url=url; } protected void onPreExecute (){ super.onPreExecute(); dialog = ProgressDialog.show(TerbaruSimasCard.this,"", "melakukan pengambilan data..."); } @Override protected String doInBackground(Void... params) { String result = ""; try { result= Connection.get(url); } catch (Exception e){ result = ""; Log.d("test", e.getMessage()); } return result; } @Override protected void onPostExecute (String result){ super.onPostExecute(result); fetchResponse(result.replace("\n","").trim()); dialog.dismiss(); } } private void fetchResponse (String result){ if (!result.equals("")){ try { JSONArray jsonArray = new JSONArray(result); TerbaruModel LT=null; ChildTerbaru CT=null; for (int i= 0; i < jsonArray.length(); i++) { JSONObject jsonObject= jsonArray.getJSONObject (i); LT= new TerbaruModel ( jsonObject.optString("img_id"), jsonObject.optString("nama"), jsonObject.optString("alamat") ); ListTerbaru.add(LT); for (int j= 0; j <jsonArray.length(); j++) { CT= new ChildTerbaru ( jsonObject.optString("begdate"), jsonObject.optString("enddate") ); ListChildTerbaru.get(i).get(j).add(CT); } ExpandableListView list = (ExpandableListView) findViewById(R.id.ExpandableListView01); TerbaruAdapter adapter = new TerbaruAdapter(this, ListTerbaru,ListChildTerbaru); list.setAdapter(adapter); } } catch (JSONException e){ e.printStackTrace(); } } } } ``` this is my TerbaruAdapter.java : ``` public class TerbaruAdapter extends BaseExpandableListAdapter{ Context context; ArrayList<TerbaruModel>ListTerbaru; ArrayList<ArrayList<ArrayList<ChildTerbaru>>> ListChildTerbaru; int count; public TerbaruAdapter (Context context, ArrayList<TerbaruModel>ListTerbaru,ArrayList<ArrayList<ArrayList<ChildTerbaru>>> ListChildTerbaru){ this.context=context; this.ListTerbaru=ListTerbaru; this.ListChildTerbaru=ListChildTerbaru; // this.count=ListTerbaru.size(); // this.count=ListChildTerbaru.size(); } @Override public boolean areAllItemsEnabled() { return true; } @Override public ArrayList<ChildTerbaru> 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(int groupPosition, int childPosition, boolean isLastChild,View convertView, ViewGroup parent) { ChildTerbaru ListChildTerbaru = (ChildTerbaru) ((ArrayList<ChildTerbaru>)getChild(groupPosition, childPosition)).get(0); ViewHolder holder= null; if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.expandablelistview_child, null); holder=new ViewHolder(); holder.begdate1=(TextView)convertView.findViewById(R.id.beg_date); holder.enddate1=(TextView)convertView.findViewById(R.id.end_date); } else{ holder=(ViewHolder)convertView.getTag(); } holder.begdate1.setText(ListChildTerbaru.getBegDate()); holder.enddate1.setText(ListChildTerbaru.getEndDate()); return convertView; } @Override public int getChildrenCount(int groupPosition) { return ListChildTerbaru.get(groupPosition).size(); } @Override public TerbaruModel 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) { TerbaruModel ListTerbaru = (TerbaruModel) getGroup(groupPosition); ViewHolder holder= null; if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.expandablelistview_group, null); holder=new ViewHolder(); holder.nama=(TextView)convertView.findViewById(R.id.name); holder.alamat=(TextView)convertView.findViewById(R.id.adress); } else{ holder=(ViewHolder)convertView.getTag(); } holder.nama.setText(ListTerbaru.getNama()); holder.alamat.setText(ListTerbaru.getAlamat()); return convertView; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int arg0, int arg1) { return true; } static class ViewHolder{ TextView begdate1, enddate1,nama, alamat, imageid; } } ``` i have no idea where's my wrong, is it because i am wrong in my parsing JSON as bellow? ``` for (int i= 0; i < jsonArray.length(); i++) { JSONObject jsonObject= jsonArray.getJSONObject (i); LT= new TerbaruModel ( jsonObject.optString("img_id"), jsonObject.optString("nama"), jsonObject.optString("alamat") ); ListTerbaru.add(LT); for (int j= 0; j <jsonArray.length(); j++) { CT= new ChildTerbaru ( jsonObject.optString("begdate"), jsonObject.optString("enddate") ); ListChildTerbaru.get(i).get(j).add(CT); } ``` or is there anything wrong else? i hope somebody can tell me where's my fault... thank you

Original source