2

データベースに裏打ちされたExpandableListViewを使用したいと思います。ここでは、データベースフィールドに応じて、子アイテムを2つの異なるビューのいずれかに表示する必要があります。

(データベースで「完了」フラグが設定されているアイテムの場合は灰色で表示され、そうでない場合は白で表示されます。)

これは、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;
    }

残念ながら、2つの異なるビューは正しく表示されません。誰かが理由を知っていますか?2つのビューは共通のViewGroupに属している必要がありますか?アダプタにgetViewTypeCount()やgetItemViewType()のようなメソッドが見つかりませんでした。このアダプタには必要ありませんか?2つのビューの要素は同じIDを持っている必要がありますか(アダプターは1つのIDのみをデータベース列にバインドするため)?

4

1 に答える 1

0

(ご想像のとおり)レイアウトには重複したIDが必要になるため、これができるとは思いません。それは許可されていないと思います。

2つの異なるレイアウトを使用する代わりに、1つのレイアウトを使用してbindChildViewから、からをオーバーライドしてExpandableListAdapter、そこで色を変更してみませんか?

私のプロジェクトの1つからの小さなサンプル(管理可能なブロックに凝縮するように編集されました):

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

上記のコードは、データベース内のフラグを使用して、アプリが背景を灰色に変更してテキストを取り消し線スタイルにするか、背景色をデフォルトの色にして取り消し線テキストをキャンセルします。

于 2012-10-06T04:32:58.163 に答える