我可以使用SimpleCursorTreeAdapter在ExpandableListView中为子节点使用不同的视图吗?

时间:2012-10-06 00:04:07

标签: android expandablelistview

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

1 个答案:

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

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