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