在为特定视图使用Contextual Action Bar时无法解析方法startActionMode()

Anj*_*ali 1 android listview contextual-action-bar actionmode

我一直试图在checkBox上使用Contextual Action Bar单击以从listView中删除多行... listview在每行中都有一个复选框和一个textview.在适配器类中,我调用startActionMode(),如下所示:

**@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder=null;
        View view=convertView;
        Log.v("ConvertView", String.valueOf(position));
        final ToPayModel state = toPayList.get(position);
        if (convertView == null)
        {
            inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.to_pay_item, null);
            holder = new ViewHolder();
            holder.name = (TextView) convertView.findViewById(R.id.tvToPay);
            holder.check = (CheckBox) convertView.findViewById(R.id.toPaycheck);
            convertView.setTag(holder);
            //holder.name.setOnCheckedChangeListener();
        }
        else
        {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.check.setOnClickListener( new View.OnClickListener()
        {
            public void onClick(View v)
            {
                CheckBox cb = (CheckBox) v;
                ToPayModel toPayModel = (ToPayModel) cb.getTag();
                Toast.makeText(context, "Clicked on Checkbox: " + cb.getText() + " is " + cb.isChecked(),
                        Toast.LENGTH_LONG).show();
                toPayModel.setCheck(cb.isChecked());
                if(state.isCheck()){
                    mActionMode=context.startActionMode(new ActionBarCallback());
                }
                else{
                    mActionMode.finish();
                }
            }
        });

        //holder.code.setText(" (" + state.getCode() + ")");
        holder.name.setText(state.getName());
        holder.check.setTextColor(Color.BLACK);
        holder.check.setChecked(state.isCheck());
        holder.check.setTag(state);
        return convertView;
    }
    public static final class ActionBarCallback implements ActionMode.Callback{
        public ActionBarCallback(){
        }
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            mode.getMenuInflater().inflate(R.menu.contextual_menu,menu);
            return true;
        }
        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            mode.setTitle("Checkbox Selected");
            return false;
        }
        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            switch(item.getItemId()){
                case R.id.delete_item:
                   // removeSelection();
                    return true;
                default: return false;
            }
        }
        @Override
        public void onDestroyActionMode(ActionMode mode) {
             mode.finish();
        }
    }**
Run Code Online (Sandbox Code Playgroud)

Adapter类扩展了BaseAdapter

public class ToPayListAdapter extends BaseAdapter {
    static Context context;
    LayoutInflater inflater;
    ActionMode mActionMode=null;
    public ArrayList<ToPayModel> toPayList;
    public ToPayListAdapter(Context context,ArrayList<ToPayModel> toPayList){

        this.context=context;
        this.toPayList=toPayList;


    }
Run Code Online (Sandbox Code Playgroud)

但问题是,当我调用startActionMode()时出错.它说不能解决方法.是因为我在getView方法中调用...我很无奈......任何回复都将受到赞赏.先感谢您.

ant*_*nio 6

该方法startActionMode已定义Activity但未定义Context(请参阅文档).

在您的第一个代码块中,如果您传递的Activity是上下文,则可以将其转换Activity为如下:

mActionMode=((Activity)context).startActionMode(new ActionBarCallback());
Run Code Online (Sandbox Code Playgroud)

或者更改声明

Context context;
Run Code Online (Sandbox Code Playgroud)

至:

Activity context;
Run Code Online (Sandbox Code Playgroud)

从评论中编辑:

如果您ActionMode.Callback从a View.OnClickListener()中启动a Fragment,则可以检索Activity此片段当前与使用的关联getActivity():

YourFragmentClass.this.getActivity().startActionMode(...);
Run Code Online (Sandbox Code Playgroud)