1

提案された CursorAdapter 実装を使用しようとすると問題が発生しますCursorLoader と一緒に。CursorAdapter は、Cursor を介して静的なデータ セットを提供できる場合はうまく機能しますが、これを CursorLoader と組み合わせようとすると、nullpointers で問題が発生します。アダプターにカーソルをフィードすると、最初は空です (CursLoader 実装を処理するときに頻繁に提案されるように、null に設定されます)。アダプターは、インスタンス化時に、カーソルをループしてチェックボックスの状態を把握し、さまざまなテキストビューやウィジェットにデータを入力します。残念ながら、カーソルはインスタンス化時に null であり、CursorLoader が完了したときにのみデータ セットが供給されます。この CursorAdapter を CursorLoader と一緒に使用することが可能かどうかを調べようとしていますが、本当に助けていただければ幸いです。

ここに私の完全なアダプターがあります:

public class ShopperListCursorAdapter extends CursorAdapter implements OnClickListener, LOG {
    private LayoutInflater mInflater;
    private GroceriesHelper mHelper;
    private List<Boolean> mCheckedState;

    public ShopperListCursorAdapter(Context context, Cursor cursor, GroceriesHelper helper, int flags) {
        super(context, cursor, flags);
        mHelper = helper;
        mInflater = LayoutInflater.from(context);
        for(mCheckedState = new ArrayList<Boolean>(); !cursor.isAfterLast(); cursor.moveToNext()) {
            mCheckedState.add(cursor.getInt(cursor.getColumnIndex(Groceries.COLUMN_CHECKED)) != 0);
        }
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        Log.d(TAG, "newView");
        View view = mInflater.inflate(R.layout.listview_row, null);
        ViewHolder holder = new ViewHolder();
        holder.amount = (TextView) view.findViewById(R.id.text_amount);
        holder.unit = (TextView) view.findViewById(R.id.text_unit);
        holder.item = (TextView) view.findViewById(R.id.text_item);
        holder.checked = (CheckBox) view.findViewById(R.id.check_item);
        holder.checked.setOnClickListener(this);
        view.setTag(holder);
        return view;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        Log.d(TAG, "bindView");
        RowData data = new RowData();
        data.id = cursor.getInt(cursor.getColumnIndex(Groceries.COLUMN_ID));
        data.amount = cursor.getString(cursor.getColumnIndex(Groceries.COLUMN_AMOUNT));
        data.unit = String.valueOf(cursor.getInt(cursor.getColumnIndex(Groceries.COLUMN_UNIT_ID)));
        data.item = cursor.getString(cursor.getColumnIndex(Groceries.COLUMN_ITEM));
        data.position = cursor.getPosition();

        ViewHolder holder = (ViewHolder) view.getTag();
        holder.amount.setText(data.amount);
        holder.unit.setText(data.unit);
        holder.item.setText(data.item);
        holder.checked.setChecked(mCheckedState.get(data.position));
        holder.checked.setTag(data);
    }

    @Override
    public void onClick(View view) {
        boolean visibility = ((CheckBox) view).isChecked();
        RowData data = (RowData) view.getTag();
        Log.d(TAG, "data: " + data.position);
        mCheckedState.set(data.position, visibility);
        mHelper.setChecked(data.id, visibility == true ? 1 : 0);
    }

    private static class ViewHolder {
        TextView amount;
        TextView unit;
        TextView item;
        CheckBox checked;
    }

    private static class RowData {
        int id;
        String amount;
        String unit;
        String item;
        int position;
    }
}
4

2 に答える 2

1

コピーアンドペースト

for(mCheckedState = new ArrayList<Boolean>(); !cursor.isAfterLast(); cursor.moveToNext()) {
    mCheckedState.add(cursor.getInt(cursor.getColumnIndex(Groceries.COLUMN_CHECKED)) != 0);
}

アダプター クラスの public ヘルパー メソッド (つまりpublic void populateAdapter()) に変換します。

次に、onLoadFinishedカーソルを (with でmAdapter.swapCursor(cursor)) スワップしてから、 を呼び出しますmAdapter.populateAdapter()Cursorこれにより、データの取り込みを試みる前に、 がアダプタにバインドされていることが保証されますmCheckedState

とはいえ、そもそも何をしようとしているのか完全にはわかりません... inmCheckedStateを使用してビューを直接チェック/チェック解除できないのはなぜですか?CursorbindView

于 2012-07-25T02:53:18.333 に答える
-1

カーソルに通知しない限り、データベースが更新されていてもカーソルは更新されません。あなたがしたいことは、クリックされた/クリックされていない状態を追跡し、それを参照して答えを得るアダプターに別の構造を持たせることです。答えがそこにない場合は、カーソルを参照してください (これは、リストを初めて表示する場合に当てはまります)。

于 2012-07-21T18:07:39.367 に答える