2

我想使用数据库支持的 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 绑定到数据库列)?

4

1 回答 1

0

我不相信你可以这样做,因为(正如你猜想的那样)布局必须有重复的 id,我认为这是不允许的。

与其尝试使用两种不同的布局,不如使用一个,然后覆盖bindChildViewfrom theExpandableListAdapter并更改其中的颜色?

我的一个项目中的一个小样本(经过编辑以将其压缩为可管理的块):

    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);
        }
    }
}

上面的代码在 db 中使用了一个标志,这将导致应用程序将背景更改为灰色并将文本更改为删除线样式,或者将背景颜色设置为我的默认颜色并取消删除线文本。

于 2012-10-06T04:32:58.163 回答