Android ExpandableListActivity and SimpleCursorTreeAdapter?

I’m writing a simple application for Android.

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

  • How to use opencv in android studio using gradle build tool?
  • MediaCodec with Surface Input: Recording in background
  • Huge UDP delay/lag with Android
  • could not find the *.apk Error
  • Can a custom View know that onPause has been called?
  • Android NDK STL c++_shared w/LIBCXX_FORCE_REBUILD results in std::stringstream NOP
  • 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:

    Checking Wi-Fi enabled or not on Android
    android.os.FileUriExposedException: file.jpg exposed beyond app through ClipData.Item.getUri()
    In android studio, how to open multiple projects in one window?
    How to prevent google chrome android browser to display the magnifier when users click a button?
    Android/Java Regex to remove extra zeros from sub-strings
    Is it common practice to ask users whether they wish to receive push notifications?
  • SharedPreferences are sometimes deleted
  • How to get a picture of a place from google maps or places API
  • Android Java - Joda Date is slow
  • How can I get a resource content from a static context?
  • unknown error (code 14): Could not open database
  • how to remove duplicate contact from contact list in 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.