我想使用数据库支持的 ExpandableListView ,其中子项应显示在两个不同视图之一中,具体取决于数据库字段。
(如果一个项目在数据库中设置了“完成”标志,它应该显示为灰色,否则它应该显示为白色。)
这就是我将 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 });
这是 Adapter 的 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;
}
不幸的是,这两个不同的视图没有正确显示。有谁知道为什么?这两个视图是否必须属于一个共同的 ViewGroup?我在适配器中没有找到任何方法,如 getViewTypeCount() 或 getItemViewType()。此适配器不需要它们吗?两个视图中的元素是否必须具有相同的 ID(因为适配器仅将一个 ID 绑定到数据库列)?