I'm writing a simple application for Android.
I have 2 tables - one called 'grous' and another called 'group_items'.
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.
Leonti
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;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDbHelper = new ExcercisesDbAdapter(this);
mDbHelper.open();
fillData();
}
private void fillData() {
mGroupsCursor = mDbHelper.fetchAllGroups(); // fills cursor with list of your top nodes - groups
startManagingCursor(mGroupsCursor);
// Cache the ID column index
mGroupIdColumnIndex = mGroupsCursor
.getColumnIndexOrThrow(ExcercisesDbAdapter.KEY_ROWID);
// Set up our adapter
mAdapter = new MyExpandableListAdapter(mGroupsCursor,this,
android.R.layout.simple_expandable_list_item_1,
R.layout.exercise_list_row,
new String[] { ExcercisesDbAdapter.KEY_TITLE }, // group title for group layouts
new int[] { android.R.id.text1 },
new String[] { ExcercisesDbAdapter.KEY_TITLE }, // exercise title for child layouts
new int[] { R.id.exercise_title });
setListAdapter(mAdapter);
}
// 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
@Override
protected Cursor getChildrenCursor(Cursor groupCursor) {
Cursor exercisesCursor = mDbHelper
.fetchExcercisesForGroup(groupCursor
.getLong(mGroupIdColumnIndex));
startManagingCursor(exercisesCursor);
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(R.id.view_button);
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);
startActivity(i);
}
});
return rowView;
}
}
}
Hope it will be useful ;)