データベースに裏打ちされたExpandableListViewを使用したいと思います。ここでは、データベースフィールドに応じて、子アイテムを2つの異なるビューのいずれかに表示する必要があります。
(データベースで「完了」フラグが設定されているアイテムの場合は灰色で表示され、そうでない場合は白で表示されます。)
これは、ExpandableListViewをデータベースにバインドする方法です。
dbAdapter = new TasksDbAdapter(this);
dbAdapter.open();
c = dbAdapter.getTaskGroupsInList(listId);
startManagingCursor(c);
dbTreeAdapter = new TaskListTreeAdapter(
getApplicationContext(),
c,
listId,
R.layout.listgroupitem,
R.layout.listitem,
new String[] {
TaskDbAdapter.KEY_TASKTYPE_NAME },
new int[] {
R.id.groupName },
new String[] {
TaskDbAdapter.KEY_LISTITEMS_AMOUNT,
TaskDbAdapter.KEY_UNITS_NAME,
TaskDbAdapter.KEY_TASK_NAME },
new int[] {
R.id.tvItemAmount,
R.id.tvItemUnit,
R.id.tvItemName });
これは、アダプタのgetChildViewメソッドです。
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
View vReturnView = null;
Cursor cGroupsTemp = dbAdapter.getGroups(listId);
if (cGroupsTemp.moveToPosition(groupPosition))
{
long groupId = cGroupsTemp.getLong(cGroupsTemp.getColumnIndex(KEY_PRODTYPE_ID));
Cursor cChildsTemp = dbAdapter.getChildren(listId, groupId);
if (cChildsTemp.moveToPosition(childPosition))
{
long childId = cChildsTemp.getLong(cChildsTemp.getColumnIndex(KEY_LISTITEMS_ID));
boolean bought = cChildsTemp.getInt(cChildsTemp.getColumnIndex(KEY_DONE)) > 0;
LayoutInflater inflater = getLayoutInflater();
if (bought)
{
vReturnView = inflater.inflate(R.layout.listenlistitemdone, null);
} else {
vReturnView = inflater.inflate(R.layout.listenlistitem, null);
}
}
}
return vReturnView;
}
残念ながら、2つの異なるビューは正しく表示されません。誰かが理由を知っていますか?2つのビューは共通のViewGroupに属している必要がありますか?アダプタにgetViewTypeCount()やgetItemViewType()のようなメソッドが見つかりませんでした。このアダプタには必要ありませんか?2つのビューの要素は同じIDを持っている必要がありますか(アダプターは1つのIDのみをデータベース列にバインドするため)?