3

したがって、現在の私の問題は、コンテキスト アクション バーを表示する ListView 内の項目を長くクリックしていることです。onItemLongClick に渡される id は、mActionModeCallback の on ActionItemClicked() メソッドで使用したい変数です。ユーザーがアイテムのリストを編集している場合、ユーザーが「編集」または「削除」アクションをクリックしたときに、何らかの形でデータベース内のその行の ID にアクセスする必要があるため、これはかなり一般的な手順のようです。

listView.setOnItemLongClickListener(new OnItemLongClickListener() {
    public boolean onItemLongClick(AdapterView<?> p, View view, int pos, long id) {

        //The id of the row in the database
        long variableThatIWantToPassToCallback = id; 
        mActionMode = getActivity().startActionMode(mActionModeCallback);
        view.setSelected(true);
        return true;
    }
});

private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {

    public boolean onCreateActionMode(ActionMode mode, Menu menu) {}

    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {}

    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        //I would like access to the id of the clicked item here, NOT item.getItemId()
    }

    public void onDestroyActionMode(ActionMode mode) {}
};
4

2 に答える 2

8

これを行う適切な方法はmActionMode.setTag("1")onItemCheckedStateChanged関数onActionItemClicked呼び出しから呼び出すことですmode.getTag();

于 2012-10-17T20:48:58.310 に答える
1

インターフェイスを拡張して独自のコールバックを作成するActionMode.Callback

private interface ActionCallback extends ActionMode.Callback {
        public void setClickedView(View view);
}

private ActionCallback mActionModeCallback = new ActionCallback() {

        public View mClickedView;

        public void setClickedView(View view) {
            mClickedView = view;
        }

        // Called when the action mode is created; startActionMode() was called
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            // Inflate a menu resource providing context menu items
            MenuInflater inflater = mode.getMenuInflater();
            inflater.inflate(R.menu.context_menu, menu);
            return true;
        }

        // Called each time the action mode is shown. Always called after onCreateActionMode, but
        // may be called multiple times if the mode is invalidated.
        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false; // Return false if nothing is done
        }

        // Called when the user selects a contextual menu item
        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item ) {
            switch ( item.getItemId() ) {
                case R.id.menu_delete:
                    Log.v( TAG, "#onActionItemClicked ready to delete the item with id: " + mClickedView.getTag() );
                    mode.finish();      // Action picked, so close the CAB
                    return true;
                default:
                    return false;
            }   // end switch
        }

        // Called when the user exits the action mode
        @Override
        public void onDestroyActionMode(ActionMode mode) {
            mActionMode = null;
        }
};

アタッチされたビューの場合、この方法でコールバックOnLongClickListenerをオーバーライドします。onLongClick

                        @Override
                // Called when the user long-clicks on someView
                public boolean onLongClick( View view ) {
                    // proceed only when actionmode is not null
                    // otherwise overlapping action modes will be
                    // displayed
                    if( mActionMode != null ) {
                        return false;
                    }

                    mActionModeCallback.setClickedView(view);
                    // Start the CAB using the ActionMode.Callback defined above
                    mActionMode = startActionMode( mActionModeCallback );
                    view.setSelected(true);
                    return true;
                }
于 2013-12-04T07:55:44.527 に答える