4

using プロジェクト内でコンテキスト (CAB)ActionModeとして使用するためのコールバックを設定しました。ActionBarActionBarSherlock

で複数のアイテムを削除できるように、複数選択を設定しようとしていますListView

デバッグ中に気づいたのですが、コンテキストActionBar(CAB) が開いていないときに、isItemChecked()タッチしたリスト アイテムを呼び出すと、必要に応じて false が返されます。しかし、CAB が開いている場合、私が触れた (以前に触れたことのない) アイテムは、への呼び出しで true を返しますisItemChecked()。次に、 から配列に対して delete を呼び出すとgetCheckedItemIds()、その配列には、以前は に対して true を返していたアイテムが含まれていませんisItemChecked()

誰もこれを見たことがありますか?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.habit);
    habitListView = (ListView)findViewById(R.id.habitsListView);
    habitListView.setAdapter(mAdapter);
    habitListView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
    habitListView.setItemsCanFocus(false);
    habitListView.setOnItemLongClickListener(new MyOnItemLongClickListener());
    habitListView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if (habitListView.isItemChecked(position)) { // for debugging, returns false here
                                                         // when CAB isnt up.
                int h = 2;
            }
            // handle differently when CAB is on.
            if (mMode != null) {
                if (habitListView.isItemChecked(position)) { // returns true here when CAB is up
                                                             // but this is the first time I'm
                                                             // clicking the item
                    habitListView.setItemChecked(position, false);
                    // turn CAB off if this is the last to be unchecked
                    if (habitListView.getCheckedItemIds().length == 0) {
                        mMode.finish();
                    }
                } else {
                    habitListView.setItemChecked(position, true);
                }
            } else {
                // start detail/edit view activity
            }
        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getSupportMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
    case R.id.menu_create:
        Habit test = new Habit("FLOSS", "GOOD", "", "");
        mDbHelper.createHabitEntry(test);
        mAdapter.changeCursor(mDbHelper.getAllEntries());
        break;
    }
    return false;
}

private class MyOnItemLongClickListener implements OnItemLongClickListener {
    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        habitListView.setItemChecked(position, true);
        mMode = startActionMode(new MyActionModeCallback());
        return true;
    }
}

private class MyActionModeCallback implements ActionMode.Callback {
    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {
        habitListView.setOnItemLongClickListener(new MyOnItemLongClickListener());
    }

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        mode.getMenuInflater().inflate(R.menu.main_long_click_context, menu);
        habitListView.setOnItemLongClickListener(null);
        return true;
    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        switch (item.getItemId()) {
        case R.id.menu_delete:
            long[] selected = habitListView.getCheckedItemIds();
            if (selected.length > 0) {
                for (long id : selected) {
                    mDbHelper.deleteEntry(id);
                }
            }
            mAdapter.changeCursor(mDbHelper.getAllEntries());
            mode.finish();
            break;
        }
        return true;
    }
};
4

1 に答える 1

2

だから私のために働いたのはただ使うことです

   habitListView.setOnItemClickListener(new OnItemClickListener(){

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            //handle differently when CAB is on.
            if (mMode != null){

                view.setSelected(!view.isSelected());

                updateCABtitle();

                //turn CAB off if this is the last to be unchecked
                    if (habitListView.getCheckedItemIds().length == 0){
                        mMode.finish();
                    } 

            } else {
                //start detail/edit view activity
                Intent intent = new Intent(getApplicationContext(), HabitDetailActivity.class);
                startActivity(intent);

            }

        }

    });

    private class MyOnItemLongClickListener implements OnItemLongClickListener{

    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view,
                    int position, long id) {


            habitListView.setItemChecked(position, true);

            mMode = startActionMode(new MyActionModeCallback());
            updateCABtitle();

            return true;
    }

}

なぜがうまくいかないのかよくわかりませんが、setItemChecked()のために働いてonItemClick()いるようですonItemLongClick()AbsListView.PerformItemClick()チェックされている/チェックされていないなどの切り替えを行う必要がある、 呼び出されるデフォルトのクリックハンドラーがあるように見えます。

于 2013-01-18T03:14:37.273 に答える