2

がありListFragment、そこに を追加し、CursorAdapterコンテキストListViewアクション バーを使用するために複数の行をクリックできるようにしたいと考えています。私は SherlockActionbar を使用していますが、単純なArrayAdapter. しかし、に切り替えるCursorAdapterと壊れます。複数の行を選択することはできません。1 つだけです。なぜそれが起こるのでしょうか?

リストonActivityCreatedを設定します:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mActionMode = null;
    mListView = getListView();
    FinTracDatabase database = mDatabaseProvider.get();
    Cursor cursor = database.getTransactionCursor(false);
    mCursorAdapter = new TransactionListAdapter(getSherlockActivity(), cursor);
    mListView.setAdapter(mCursorAdapter);
    mListView.setItemsCanFocus(false);
    mListView.setOnItemClickListener(this);
    mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}

これは私のAdapterです:

private class TransactionListAdapter extends CursorAdapter {

    public TransactionListAdapter(Context context, Cursor cursor) {
        super(context, cursor, 0);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        bindToExistingView(view, cursor);
    }

    private void bindToExistingView(View view, Cursor cursor) {
        CheckedTextView amountView = (CheckedTextView) view;
        amountView.setText(cursor.getString(cursor.getColumnIndex(Transactions.TITLE)));
    }

    @Override
    public View newView(Context arg0, Cursor arg1, ViewGroup arg2) {
        LayoutInflater layoutInflater = getSherlockActivity().getLayoutInflater();
        View view = layoutInflater.inflate(android.R.layout.simple_list_item_multiple_choice, arg2, false);
        bindToExistingView(view, arg1);
        return view;
    }

}

そして最後に onClickListener:

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    SparseBooleanArray checked = mListView.getCheckedItemPositions();
    boolean hasCheckedElement = true;
    for (int i = 0; i < checked.size() && !hasCheckedElement; i++) {
        hasCheckedElement = checked.valueAt(i);
    }

    if (hasCheckedElement) {
        if (mActionMode == null) {
            mActionMode = getSherlockActivity().startActionMode(new SelectingActionMode());
        }
    } else {
        if (mActionMode != null) {
            mActionMode.finish();
        }
    }
}

アダプタを単純なものに切り替えると、正常にArrayAdapter動作します。

new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_multiple_choice, new String[]{"A", "B", "C"})

私は絶望的で、なぜこれが起こっているのかわかりません。

4

1 に答える 1

2

モードが適切に機能するためには、アダプター内の各アイテムがメソッドListView.CHOICE_MODE_MULTIPLEから一意の値を返す必要があります。getItemId()

アダプターに使用しているカーソルは、次の行で生成されます。

  FinTracDatabase database = mDatabaseProvider.get();
  Cursor cursor = database.getTransactionCursor(false);

各行の「_id」列に一意の値があるかどうかを確認できますか? それらはすべて同じ値を共有しているため、表示される動作が発生しているのではないかと思います。

于 2012-08-17T19:29:07.873 に答える