我想使用數據庫支持的ExpandableListView,根據數據庫字段,子項應顯示在兩個不同視圖之一中。我可以使用SimpleCursorTreeAdapter爲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嗎? 我沒有在Adapter中找到像getViewTypeCount()或getItemViewType()這樣的方法。 這個適配器不需要它們嗎? 兩個視圖中的元素是否必須具有相同的ID(因爲適配器僅將一個ID綁定到數據庫列)?