title: How to add Three Level ListView in ExpandableListView in android
body: <p>I want to add one more level of in ExpandableListView.In current ExpandableListView is two level how can i add one more level. I am new in android developing please help me. Thanks in advance! </p>
  
  <p>My MainActivity.java:-</p>
  
  <pre><code> private Toolbar mToolbar;
  ExpandableListAdapter listAdapter;
  ExpandableListView expListView;
  List&lt;String&gt; listDataHeader;
  HashMap&lt;String, List&lt;String&gt;&gt; listDataChild;
  
  //   private FragmentDrawer drawerFragment;
  ArrayList&lt;String&gt; arraylist1,arraylist2,arraylist3,arrayList4,arrayList5;
  int cnt = 0;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
  
      mToolbar = (Toolbar) findViewById(R.id.toolbar);
  
      setSupportActionBar(mToolbar);
      getSupportActionBar().setDisplayShowHomeEnabled(true);
  
      expListView = (ExpandableListView) findViewById(R.id.lvExp);
  
      // preparing list data
      prepareListData();
  
      listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild);
  
      // setting list adapter
      expListView.setAdapter(listAdapter);
  
     /*      drawerFragment = (FragmentDrawer)
              getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
      drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), mToolbar);
      drawerFragment.setDrawerListener(this);*/
      // display the first navigation drawer view on app launch
    //      displayView(0);
      Log.d("oncreate method", "");
      arraylist1  = new ArrayList&lt;String&gt;();
      arraylist2  = new ArrayList&lt;String&gt;();
      arraylist3  = new ArrayList&lt;String&gt;();
      arrayList4 =  new ArrayList&lt;String&gt;();
      arrayList5 =  new ArrayList&lt;String&gt;();
      new ProductsAsynTask().execute("http://opencart.codeniques.com/shopping/?route=feed/web_api/menu&amp;key=test123$");
  
  
  }
  private void prepareListData() {
      listDataHeader = new ArrayList&lt;String&gt;();
      listDataChild = new HashMap&lt;String, List&lt;String&gt;&gt;();
  
  
      // Adding child data
      listDataHeader.add("Top 250");
      listDataHeader.add("Now Showing");
      listDataHeader.add("Coming Soon..");
  
      // Adding child data
      List&lt;String&gt; top250 = new ArrayList&lt;String&gt;();
      top250.add("The Shawshank Redemption");
      top250.add("The Godfather");
      top250.add("The Godfather: Part II");
      top250.add("Pulp Fiction");
      top250.add("The Good, the Bad and the Ugly");
      top250.add("The Dark Knight");
      top250.add("12 Angry Men");
  
      List&lt;String&gt; nowShowing = new ArrayList&lt;String&gt;();
      nowShowing.add("The Conjuring");
      nowShowing.add("Despicable Me 2");
      nowShowing.add("Turbo");
      nowShowing.add("Grown Ups 2");
      nowShowing.add("Red 2");
      nowShowing.add("The Wolverine");
  
      List&lt;String&gt; comingSoon = new ArrayList&lt;String&gt;();
      comingSoon.add("2 Guns");
      comingSoon.add("The Smurfs 2");
      comingSoon.add("The Spectacular Now");
      comingSoon.add("The Canyons");
      comingSoon.add("Europa Report");
  
      listDataChild.put(listDataHeader.get(0), top250); // Header, Child data
      listDataChild.put(listDataHeader.get(1), nowShowing);
      listDataChild.put(listDataHeader.get(2), comingSoon);
  }
  
  public class ProductsAsynTask extends AsyncTask&lt;String,Void,Void&gt;{
  
      ProgressDialog dialog;
  
      protected void onPreExecute(){
          super.onPreExecute();
          Log.d("In onPreExceute","");
          dialog = new ProgressDialog(MainActivity.this);
          dialog.setMessage("Loading, Please wait");
          dialog.setTitle("Connecting server");
          dialog.show();
          dialog.setCancelable(false);
      }
  
      protected Void doInBackground(String... param){
          try{
              Log.d("In doInBackground","");
  
              HttpClient client= new DefaultHttpClient();
              HttpPost post = new HttpPost(param[0]);
              HttpResponse response = client.execute(post);
  
              int status = response.getStatusLine().getStatusCode();
  
              if(status == 200){
                  Log.d("Status",""+status);
  
                  HttpEntity entity = response.getEntity();
                  String data = EntityUtils.toString(entity);
  
                  JSONObject jsonObject = new JSONObject(data);
                  JSONArray jArray = jsonObject.getJSONArray("categories");
  
                  for(int i = 0;i &lt; jArray.length();i++){
                      cnt++;
                      Log.d("value of array",jArray.length()+"");
                      Log.d("Value of i",""+i);
  
                      JSONObject jsonObject1 = jArray.getJSONObject(i);
  
  
                      arraylist1.add(jsonObject1.getString("name"));
                      //data1 = jsonObject1.getString("name");
                //      Log.d("hello ",data1);
  
                      JSONArray jsonArray = jsonObject1.getJSONArray("children");
           //           JSONObject jsonObject2 = jsonObject1.getJSONObject("children");
  
                      for(int j=0;j&lt;jsonArray.length();j++){
  
                          JSONObject jsonObject2 = jsonArray.getJSONObject(j);
  
                          arraylist2.add(jsonObject2.getString("name"));
                        //  data2 = jsonObject2.getString("name");
                          JSONArray jsonArray1 = jsonObject2.getJSONArray("children_lv3");
  
                          for(int k=0;k&lt;jsonArray1.length();k++){
                              JSONObject jsonObject3 = jsonArray1.getJSONObject(k);
  
                              arraylist3.add(jsonObject3.getString("name"));
                              arrayList4.add(jsonObject3.getString("href"));
                             /*  data3 = jsonObject3.getString("name");
                               data4 = jsonObject3.getString("href");   */
                          }
                          arrayList5.add(jsonObject2.getString("href"));
                        // data5 = jsonObject2.getString("href");
                      }
                  }
  
              }
          }catch(IOException e){
              Log.e("Error IOException :",e.getMessage());
          }catch (JSONException e){
              Log.e("Error JSONException",e.getMessage());
          }
              return null;
      }
  
      protected void onPostExecute(Void aVoid) {
          super.onPostExecute(aVoid);
          dialog.dismiss();
          Log.d("Counter value",""+cnt);
      }
  }
  
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu; this adds items to the action bar if it is present.
      getMenuInflater().inflate(R.menu.menu_main, menu);
      return true;
  }
  
  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
      // Handle action bar item clicks here. The action bar will
      // automatically handle clicks on the Home/Up button, so long
      // as you specify a parent activity in AndroidManifest.xml.
      int id = item.getItemId();
  
      //noinspection SimplifiableIfStatement
      if (id == R.id.action_settings) {
          return true;
      }
  
      if(id == R.id.action_search){
          Toast.makeText(getApplicationContext(), "Search action is selected!", Toast.LENGTH_SHORT).show();
          return true;
      }
  
      return super.onOptionsItemSelected(item);
  }
  
  
   /*  public void onDrawerItemSelected(View view, int position) {
      displayView(position);
  }
  
  private void displayView(int position) {
      Fragment fragment = null;
      String title = getString(R.string.app_name);
      switch (position) {
          case 0:
  
             fragment = new HomeFragment();
             title = getString(R.string.title_home);
              break;
          case 1:
              fragment = new FriendsFragment();
              title = getString(R.string.title_friends);
              break;
          case 2:
              fragment = new MessagesFragment();
              title = getString(R.string.title_messages);
              break;
          default:
              break;
      }
  
      if (fragment != null) {
          FragmentManager fragmentManager = getSupportFragmentManager();
          FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
          fragmentTransaction.replace(R.id.container_body, fragment);
          fragmentTransaction.commit();
  
          // set the toolbar title
          getSupportActionBar().setTitle(title);
      }
  }*/}
  </code></pre>
  
  <p>My ExpandableListAdapter.java is here:-</p>
  
  <pre><code>public class ExpandableListAdapter extends BaseExpandableListAdapter  {
  
  private Context _context;
  private List&lt;String&gt; _listDataHeader; // header titles
  // child data in format of header title, child title
  private HashMap&lt;String, List&lt;String&gt;&gt; _listDataChild;
  
  public ExpandableListAdapter(Context context, List&lt;String&gt; listDataHeader,
                               HashMap&lt;String, List&lt;String&gt;&gt; listChildData) {
      this._context = context;
      this._listDataHeader = listDataHeader;
      this._listDataChild = listChildData;
  }
  
  @Override
  public Object getChild(int groupPosition, int childPosititon) {
      return this._listDataChild.get(this._listDataHeader.get(groupPosition))
              .get(childPosititon);
  }
  
  @Override
  public long getChildId(int groupPosition, int childPosition) {
      return childPosition;
  }
  
  @Override
  public View getChildView(int groupPosition, final int childPosition,
                           boolean isLastChild, View convertView, ViewGroup parent) {
  
      final String childText = (String) getChild(groupPosition, childPosition);
  
      if (convertView == null) {
          LayoutInflater infalInflater = (LayoutInflater) this._context
                  .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          convertView = infalInflater.inflate(R.layout.list_item, null);
      }
  
      TextView txtListChild = (TextView) convertView
              .findViewById(R.id.lblListItem);
  
      txtListChild.setText(childText);
      return convertView;
  }
  
  @Override
  public int getChildrenCount(int groupPosition) {
      return this._listDataChild.get(this._listDataHeader.get(groupPosition))
              .size();
  }
  
  @Override
  public Object getGroup(int groupPosition) {
      return this._listDataHeader.get(groupPosition);
  }
  
  @Override
  public int getGroupCount() {
      return this._listDataHeader.size();
  }
  
  @Override
  public long getGroupId(int groupPosition) {
      return groupPosition;
  }
  
  @Override
  public View getGroupView(int groupPosition, boolean isExpanded,
                           View convertView, ViewGroup parent) {
      String headerTitle = (String) getGroup(groupPosition);
      if (convertView == null) {
          LayoutInflater infalInflater = (LayoutInflater) this._context
                  .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          convertView = infalInflater.inflate(R.layout.list_group, null);
      }
  
      TextView lblListHeader = (TextView) convertView
              .findViewById(R.id.lblListHeader);
      lblListHeader.setTypeface(null, Typeface.BOLD);
      lblListHeader.setText(headerTitle);
  
      return convertView;
  }
  
  @Override
  public boolean hasStableIds() {
      return false;
  }
  
  @Override
  public boolean isChildSelectable(int groupPosition, int childPosition) {
      return true;
  }}
  </code></pre>
  
  <p>My activity_main.xml is here:-</p>
  
  <pre><code>&lt;android.support.v4.widget.DrawerLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/drawer_layout"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"&gt;
  
  
  &lt;LinearLayout
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical"&gt;
  
      &lt;LinearLayout
          android:id="@+id/container_toolbar"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:orientation="vertical"&gt;
  
          &lt;include
              android:id="@+id/toolbar"
              layout="@layout/toolbar" /&gt;
  
  
      &lt;/LinearLayout&gt;
  
      &lt;FrameLayout
          android:id="@+id/container_body"
          android:layout_width="fill_parent"
          android:layout_height="0dp"
          android:layout_weight="1" /&gt;
  
  
  
  
  &lt;/LinearLayout&gt;
  
  &lt;ExpandableListView
      android:id="@+id/lvExp"
      android:layout_height="match_parent"
      android:layout_width="260dp"
      android:layout_gravity="start"/&gt;
      &lt;!-- &lt;fragment
      android:id="@+id/fragment_navigation_drawer"
      android:name="com.android.ShoppingMazza.activity.ExpandableListAdapter"
      android:layout_width="@dimen/nav_drawer_width"
      android:layout_height="match_parent"
      android:layout_gravity="start"
      app:layout="@layout/fragment_navigation_drawer"
      tools:layout="@layout/fragment_navigation_drawer" /&gt; --&gt;
    &lt;/android.support.v4.widget.DrawerLayout&gt;
  </code></pre>