Skip to main content

Android Expandable List View Tutorial

Expandable list view is used to group list data by categories. It has the capability of expanding and collapsing the groups when user touches header.
If you are not aware of list view before please refer to this tutorial Android ListView Tutorial
Download Code
Let’s start by creating a new project..







//MainActivity.java


package info.androidhive.expandablelistview;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
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;

   @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();

      listAdapter = new ExpandableListAdapter(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;
         }
      });

      // 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() {
      listDataHeader = new ArrayList<String>();
      listDataChild = new HashMap<String, List<String>>();

      // Adding child data      listDataHeader.add("Phones & Tablets");
      listDataHeader.add("Man's Fashion");
      listDataHeader.add("Woman's Fashion");
      listDataHeader.add("Coming Soon..");

      // Adding child data      List<String> phonetablets = new ArrayList<String>();
      phonetablets.add("Samsung");
      phonetablets.add("Apple");
      phonetablets.add("TABLETS: Part II");
      phonetablets.add("Samsung");
      phonetablets.add("Apple");
      phonetablets.add("Huawei");


      List<String> manfashions = new ArrayList<String>();
      manfashions.add("T-shirts");
      manfashions.add("Shirts");
      manfashions.add("Jackets & Coats");
      manfashions.add("Windcheater");
      manfashions.add("Hoodies");
      manfashions.add("Sports Wear");

      List<String> womanfashions = new ArrayList<String>();
      womanfashions.add("shirts");
      womanfashions.add("Windcheater");
      womanfashions.add("Hoodies");
      womanfashions.add("The Canyons");
      womanfashions.add("Sports");


      List<String> comingSoon = new ArrayList<String>();
      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), phonetablets); // Header, Child data      listDataChild.put(listDataHeader.get(1), manfashions);
      listDataChild.put(listDataHeader.get(2), womanfashions);
      listDataChild.put(listDataHeader.get(3), comingSoon);

   }
}

Comments