Android ExpandableListActivity and SimpleCursorTreeAdapter?

I’m writing a simple application for Android.

I have 2 tables – one called ‘grous’ and another called ‘group_items’.

  • Different app names for different build flavors?
  • SampleSyncAdapter Breakpoints Not Working
  • Android drawing an animated line
  • Not targeting the latest versions of Android
  • Dagger 2 scope and subcomponents
  • Need help in POST multiple image file using retrofit?
  • I want to use expandable list to display data from both tables.

    What is the best way to do it? Is it possible to map data by using SimpleCursorTreeAdapter? I couldn’t find any usefull examples.

    I saw the examples creating expandable lists using ArrayAdapter, so should I convert data to array first and then create an expandable list with it or there is the way to do it directly?

    I don’t need a full working example – just an advice on what is the correct and most efficient way to do it.


    Related posts:

    GET_ACCOUNTS permission while using GCM - Why is this needed?
    KeyStore and Key Alias
    Firebase crashes on Android during anonymous login
    Convert a Bitmap to GrayScale in Android
    Get URI of .mp3 file stored in res/raw folder in android
    Which view should be used for new Material Design Bottom Navigation?
  • How do I simulate rotating the device with Android emulator?
  • Android Shared Element Transition: Transforming an ImageView from a circle to a rectangle and back again
  • Adding custom view to a toolbar
  • android what is wrong with openFileOutput?
  • Android (Java) Real-time Audio Input (microphone AND USB) and Output
  • unable to make connection between 2 device bluetooth android
  • One Solution collect form web for “Android ExpandableListActivity and SimpleCursorTreeAdapter?”

    I found that the simplest solution would be to use SimpleCursorTreeAdapter.
    Here is code example (important parts):

    public class ExercisesList extends ExpandableListActivity {
    private ExcercisesDbAdapter mDbHelper; // your db adapter
    private Cursor mGroupsCursor; // cursor for list of groups (list top nodes)
    private int mGroupIdColumnIndex;
    private MyExpandableListAdapter mAdapter;
    public void onCreate(Bundle savedInstanceState) {
            mDbHelper = new ExcercisesDbAdapter(this);
    private void fillData() {
            mGroupsCursor = mDbHelper.fetchAllGroups(); // fills cursor with list of your top nodes - groups 
            // Cache the ID column index
            mGroupIdColumnIndex = mGroupsCursor
            // Set up our adapter
            mAdapter = new MyExpandableListAdapter(mGroupsCursor,this,
                            new String[] { ExcercisesDbAdapter.KEY_TITLE }, // group title for group layouts
                            new int[] { },
                            new String[] { ExcercisesDbAdapter.KEY_TITLE }, // exercise title for child layouts
                            new int[] { });
    // extending SimpleCursorTreeAdapter
    public class MyExpandableListAdapter extends SimpleCursorTreeAdapter {
            public MyExpandableListAdapter(Cursor cursor, Context context,
                            int groupLayout, int childLayout, String[] groupFrom,
                            int[] groupTo, String[] childrenFrom, int[] childrenTo) {
                    super(context, cursor, groupLayout, groupFrom, groupTo,
                                    childLayout, childrenFrom, childrenTo);
            // returns cursor with subitems for given group cursor
            protected Cursor getChildrenCursor(Cursor groupCursor) {
                    Cursor exercisesCursor = mDbHelper
                    return exercisesCursor;
            // I needed to process click on click of the button on child item
            public View getChildView(final int groupPosition,
                            final int childPosition, boolean isLastChild, View convertView,
                            ViewGroup parent) {
                    View rowView = super.getChildView(groupPosition, childPosition,
                                    isLastChild, convertView, parent);
                    Button details = (Button) rowView.findViewById(;
                    details.setOnClickListener(new OnClickListener() {
                            public void onClick(View v) {
                                    Cursor exerciseCursor = getChild(groupPosition, childPosition);
                                    Long exerciseId = exerciseCursor.getLong(exerciseCursor.getColumnIndex(ExcercisesDbAdapter.KEY_ROWID));
                                    Intent i = new Intent(ExercisesList.this, ExerciseView.class);
                                    i.putExtra(ExcercisesDbAdapter.KEY_ROWID, exerciseId);
                    return rowView;

    Hope it will be useful 😉

    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.