我想使用支持数据库的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 });
这是适配器的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绑定到数据库列)?
答案 0 :(得分:0)
我不相信你能做到这一点,因为(你猜)布局必须有重复的id,我不认为这是允许的。
不是尝试使用两种不同的布局,为什么不使用单一布局,然后覆盖bindChildView
中的ExpandableListAdapter
并更改其中的颜色?
我的一个项目中的一个小样本(编辑后将其浓缩为可管理的块):
protected void bindChildView(View view, Context context, Cursor cursor,
boolean isLastChild) {
TextView name = (TextView) view.findViewById(R.id.ListItem1);
TextView qty = (TextView) view.findViewById(R.id.ListItem3);
name.setTextColor(GroceryApplication.shoplistitem_name);
qty.setTextColor(GroceryApplication.shoplistitem_qty);
name.setText(cursor.getString(2));
qty.setText(cursor.getString(1));
if (cursor.getInt(5) == 1) {
name.setPaintFlags(name.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
qty.setPaintFlags(qty.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
view.setBackgroundResource(R.color.purchased);
} else {
name.setPaintFlags(name.getPaintFlags()
& ~Paint.STRIKE_THRU_TEXT_FLAG);
qty.setPaintFlags(qty.getPaintFlags()
& ~Paint.STRIKE_THRU_TEXT_FLAG);
view.setBackgroundResource(R.color.black);
}
}
}
上面的代码在数据库中使用了一个标志,这将导致应用程序将背景更改为灰色,文本为删除线样式或背景颜色为我的默认颜色,并取消删除线文本。