首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Android startActionMode无法解决

Android startActionMode无法解决
EN

Stack Overflow用户
提问于 2016-04-01 01:00:15
回答 2查看 1.3K关注 0票数 0

我遵循了一个教程(https://www.youtube.com/watch?v=8XR0cy3YgLo),稍微修改了它,然后合并了onLongClickListener (https://www.youtube.com/watch?v=jGW95imi9tw),其中所有的代码都可以正常工作,除了我希望使用CAB (上下文操作栏)来选择多个条目并能够删除所选的内容之外。

代码语言:javascript
代码运行次数:0
运行
复制
public class MyAdapter extends RecyclerView.Adapter<MyHolder> {

Context c;
ArrayList<Player> players;
ActionMode mActionMode;

..。

代码语言:javascript
代码运行次数:0
运行
复制
//View Holder Initialised
    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    //View obj
    View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.model,null);

    //Holder
    MyHolder holder=new MyHolder(v);
    return holder;
}

//Data is bound to views
@Override
public void onBindViewHolder(MyHolder holder, int position) {
    holder.nameTxt.setText(players.get(position).getName());
    holder.posTxt.setText(players.get(position).getPosition());
    holder.img.setImageResource(R.drawable.marker);

    //When view is clicked
    holder.setItemClickListener(new ItemClickListener() {
        @Override
        public void onItemClick(View v, int pos) {
            Snackbar.make(v,players.get(pos).getName() + " 1 ", Snackbar.LENGTH_SHORT).show();
        }
    });

    holder.setItemLongClickListener(new ItemLongClickListener() {
        @Override
        public void onItemLongClick(View v, int pos) {
            mActionMode = startActionMode(new ActionMode.Callback() {
                @Override
                public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                    mode.setTitle("Selected");

                    MenuInflater inflater = mode.getMenuInflater();
                    inflater.inflate(R.menu.contextual_menu, menu);
                    return true;
                }

                @Override
                public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                    return true;
                }

                @Override
                public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                    switch (item.getItemId()) {
                        case R.id.action_delete:
                            //deleteClicked();
                            mode.finish();
                            return true;
                        default:
                            //doneClicked();
                            return false;
                    }
                }

                @Override
                public void onDestroyActionMode(ActionMode mode) {
                }
            });
        }
    });
}

因此,我遇到的问题是'mActionMode =startActionMode(新的ActionMode.Callback() {‘)不能工作,因为'startActionMode’无法解决。

我知道startActionMode属于AppCompat,但我无法理解如何初始化CAB。我环顾四周,似乎找不到确切的答案,所以希望能有任何帮助来解决这个问题。

编辑

我现在已经设法通过长点击处理程序(在本教程之后:http://www.startingandroid.com/how-to-use-sqlite-database-in-android/)显示CAB (上下文操作栏),但我无法实际获得对给定项的引用。目前,单击任何项目都会弹出CAB,但我没有引用单击的项目。

代码语言:javascript
代码运行次数:0
运行
复制
@Override
public UserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.user_row, parent, false);
    UserViewHolder userViewHolder = new UserViewHolder(v);

    v.setClickable(true);

    v.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Snackbar.make(v, "CLICK", Snackbar.LENGTH_SHORT).show();
        }
    });

    v.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            Snackbar.make(v, "LONG CLICK", Snackbar.LENGTH_SHORT).show();
            if (mActionMode != null) {
                return false;
            }
            v.startActionMode(new ActionMode.Callback() {
                @Override
                public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                    MenuInflater inflater = mode.getMenuInflater();
                    inflater.inflate(R.menu.context, menu);
                    return true;
                }

                @Override
                public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                    return false;
                }

                @Override
                public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                    //get number of selected items

                    switch (item.getItemId()) {
                        case R.id.context_favourite:
                            //SQL - Favourite Item
                            mode.finish();
                        case R.id.context_delete:
                            //SQL - Delete Item
                            mode.finish();
                    }
                    return false;
                }

                @Override
                public void onDestroyActionMode(ActionMode mode) {
                    mActionMode = null;
                }
            });
            return true;
        }
    });
    return userViewHolder;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-01 01:16:51

只有当您在某个活动中或您有要进行该调用的活动的引用时,startActionMode才是可用的方法。

从您的代码中,您实际上是从您的MyAdapter类(它不是Activity )调用它。

票数 0
EN

Stack Overflow用户

发布于 2017-11-10 19:16:09

使用view.startActionMode

代码语言:javascript
代码运行次数:0
运行
复制
public class ViewHolder extends RecyclerView.ViewHolder implements
        View.OnClickListener,
        View.OnLongClickListener {

    public ViewHolder(View view) {
        super(view);
        view.setOnClickListener(this);
        view.setOnLongClickListener(this);
    }

    @Override
    public void onClick(View v) {

    }

    @Override
    public boolean onLongClick(View view) {
        view.startActionMode(...);
        return true;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36346329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档