Wednesday, April 7, 2010

Steps to implement ExpandableListView in android

3 Steps to implement the Expandable ListView  in android

Step 1 : Initilize the ExpandableListView and ExpandableListAdapter in a onCreate()

    ExpandableListAdapter mAdapter;
    ExpandableListView epView = (ExpandableListView) findViewById(R.id.ExpandableListView01);
    mAdapter = new MyExpandableListAdapter();
    epView.setAdapter(mAdapter);

Step 2 : Create a custom BaseApdapter Class
 /**
     * A simple adapter which maintains an ArrayList of photo resource Ids. Each
     * photo is displayed as an image. This adapter supports clearing the list
     * of photos and adding a new photo.
     *
     */
    public class MyExpandableListAdapter extends BaseExpandableListAdapter {
    // Sample data set. children[i] contains the children (String[]) for
    // groups[i].
    private String[] groups = { "Parent1", "Parent2",
        "Parent3" };
    private String[][] children = { { "Child1" },{ "Child2" }, { "Child3" },{ "Child4" }, { "Child5" } };

    public Object getChild(int groupPosition, int childPosition) {
        return children[groupPosition][childPosition];
    }

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

    public int getChildrenCount(int groupPosition) {
        int i = 0;
        try {
        i = children[groupPosition].length;

        } catch (Exception e) {
        }

        return i;
    }

    public TextView getGenericView() {
        // Layout parameters for the ExpandableListView
        AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
            ViewGroup.LayoutParams.FILL_PARENT, 64);

        TextView textView = new TextView(MainActivity.this);
        textView.setLayoutParams(lp);
        // Center the text vertically
        textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
        textView.setTextColor(R.color.marcyred);
        // Set the text starting position
        textView.setPadding(36, 0, 0, 0);
        return textView;
    }

    public View getChildView(int groupPosition, int childPosition,
        boolean isLastChild, View convertView, ViewGroup parent) {
        TextView textView = getGenericView();
        textView.setText(getChild(groupPosition, childPosition).toString());
        return textView;
    }

    public Object getGroup(int groupPosition) {
        return groups[groupPosition];
    }

    public int getGroupCount() {
        return groups.length;
    }

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

    public View getGroupView(int groupPosition, boolean isExpanded,
        View convertView, ViewGroup parent) {
        TextView textView = getGenericView();
        textView.setText(getGroup(groupPosition).toString());
        return textView;
    }

    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

    public boolean hasStableIds() {
        return true;
    }

    }
   
3. Listeners
    epView.setOnGroupClickListener(new OnGroupClickListener() {
        @Override
        public boolean onGroupClick(ExpandableListView arg0, View arg1,
            int groupPosition, long arg3) {
        if (groupPosition == 5) {               

        }
        return false;
        }
        });

    epView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
    @Override
    public boolean onChildClick(ExpandableListView parent,
            View v, int groupPosition, int childPosition,
            long id) {
        if (groupPosition == 0 && childPosition == 0) {
           
        }
        return false;
    }
    });

13 comments:

  1. I am new to Android. Where is "R.id.ExpandableListView01" declared?

    ReplyDelete
  2. It's never declared. It's created dynamically at build time from an XML file (which, unfortunately, is not explained or given in the example).

    ReplyDelete
  3. Replies
    1. set android:groupindicator="@null" in xml

      Delete
  4. hi
    i m using base adapter.
    and i m inflating a layout which contains(1 textview,1 spinner).
    every time i select item from different different spinner, i got the same value for all though having diff diff values.

    i m stuck on my school project.
    deadlines are near.
    plz. help me out

    ReplyDelete
  5. Where do you get MainActivity.this ?

    I have an Activity, that has a layout within the layout I want to have this ExpandableListView Currently the layout.xml has
    ....

    ....

    and other objects.

    ReplyDelete
  6. hi I wanna use an image icon in childs of android expandable listview same type explained above ..
    anyone can guide me how i can do this .?
    wating at
    I shall be very very thankful to you ...
    aftab.nasir13(at)gmail.com

    ReplyDelete
  7. Hi This code is giving me error Null pointer Here is the LogCat...




    04-01 13:22:07.433: ERROR/AndroidRuntime(344): at com.expandable.MainExpandable.onCreate(MainExpandable.java:34)
    04-01 13:22:07.433: ERROR/AndroidRuntime(344): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    04-01 13:22:07.433: ERROR/AndroidRuntime(344): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)

    ReplyDelete
  8. Hello, can you give me your project to my mail lethailinh9999@gmail.com. Cause i can't handle some error.Thank you so much

    ReplyDelete
  9. do we have to always use same number of child items for each group?

    ReplyDelete
  10. hi i need this code where can i get complete code

    ReplyDelete
  11. it is not work in android 4.0.3

    ReplyDelete
    Replies
    1. first of all can i know what is the difference between listview and expandable list view in android please..

      Delete