Android 包含RecyclerView和CardView的ContextMenu

Android 包含RecyclerView和CardView的ContextMenu,android,contextmenu,android-recyclerview,Android,Contextmenu,Android Recyclerview,我想在recyclerview的cardview项目上有一个上下文菜单 并没有真正提供解决方案 我可以在ViewHolder上创建OnClickListener和OnLongClickListener。我也可以放入OnCreateContextMenu,但从来没有调用过OnCreateContextMenu 有人能举个例子吗 大家好, 您不能直接实现这些方法,如onClickListener, OnContextMenuListener等,因为RecycleView扩展了android.view

我想在recyclerview的cardview项目上有一个上下文菜单

并没有真正提供解决方案

我可以在ViewHolder上创建OnClickListener和OnLongClickListener。我也可以放入OnCreateContextMenu,但从来没有调用过OnCreateContextMenu

有人能举个例子吗

大家好, 您不能直接实现这些方法,如onClickListenerOnContextMenuListener等,因为RecycleView扩展了android.view.ViewGroup 所以我们不能直接使用这些方法。 我们可以在ViewHolder适配器类中实现这些方法。 我们可以像这样在RecycleView中使用上下文菜单

现在,我们在实现上下文菜单时遵循相同的过程

@Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {

        menu.setHeaderTitle("Select The Action");    
        menu.add(0, v.getId(), 0, "Call");//groupId, itemId, order, title   
        menu.add(0, v.getId(), 0, "SMS"); 

    }
如果你遇到任何困难,请发表评论

如果您没有设置长时间单击侦听器,菜单将在长时间单击事件时打开,并显示:

public static class MyViewHolder extends RecyclerView.ViewHolder
      implements View.OnCreateContextMenuListener, View.OnClickListener,
      MenuItem.OnMenuItemClickListener {

    MyViewHolder(View itemView) {
      super(itemView);
      itemView.setOnClickListener(this);
      itemView.setOnCreateContextMenuListener(this);
    }


    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenu.ContextMenuInfo menuInfo) {
        MenuItem myActionItem = menu.add("Some menu item");
        myActionItem.setOnMenuItemClickListener(this);
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
      // Menu Item Clicked!
      return true;
    }
}

我可能会迟到,但我有一个有效的解决办法。我已经为它做了一个要点

将上下文菜单添加到RecyclerView

ActivityName.java

//Import Statements

public class ActivityName extends AppCompatActivity {
    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_birthdays);


        //Recycle View
        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
        mLayoutManager = new LinearLayoutManager(getApplicationContext());
        mRecyclerView.setLayoutManager(mLayoutManager);
        mAdapter = new BirthdaysListAdapter(data, this);
        mRecyclerView.setAdapter(mAdapter);


    }
//Import Statements


public class BirthdaysListAdapter extends RecyclerView.Adapter<BirthdaysListAdapter.ViewHolder> {
    static Context ctx;

    private List<typeOfData> Data;


    public BirthdaysListAdapter(List<typeOfData> list, Context context) {
        Data = list;
        this.ctx = context;

    }

    BirthdaysListAdapter() {
    }

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {
        public TextView name;
        public TextView Birthday;
        public ImageView colorAlphabet;
        public TextView textInImg;


        public ViewHolder(View v) {
            super(v);
            name = (TextView) v.findViewById(R.id.name);
            Birthday = (TextView) v.findViewById(R.id.Birthday);
            colorAlphabet = (ImageView) v.findViewById(R.id.colorAlphabet);
            textInImg = (TextView) v.findViewById(R.id.textInImg);


            v.setOnCreateContextMenuListener(this); //REGISTER ONCREATE MENU LISTENER
        }

        @Override
        public void onCreateContextMenu(ContextMenu menu, View v                         //CREATE MENU BY THIS METHOD
                                        ContextMenu.ContextMenuInfo menuInfo) {
            new BirthdaysListAdapter().info = (AdapterView.AdapterContextMenuInfo) menuInfo;
            MenuItem Edit = menu.add(Menu.NONE, 1, 1, "Edit");
            MenuItem Delete = menu.add(Menu.NONE, 2, 2, "Delete");
            Edit.setOnMenuItemClickListener(onEditMenu);
            Delete.setOnMenuItemClickListener(onEditMenu);


        }
//ADD AN ONMENUITEM LISTENER TO EXECUTE COMMANDS ONCLICK OF CONTEXT MENU TASK
        private final MenuItem.OnMenuItemClickListener onEditMenu = new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {


                DBHandler dbHandler = new DBHandler(ctx);
                List<WishMen> data = dbHandler.getWishmen();

                switch (item.getItemId()) {
                    case 1:
                        //Do stuff
                        break;

                    case 2:
                       //Do stuff

                        break;
                }
                return true;
            }
        };


    }


    public List<ViewBirthdayModel> getData() {
        return Data;
    }


    @Override
    public long getItemId(int position) {

        return super.getItemId(position);
    }


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_view_birthdays, parent, false);
        ViewHolder vh = new ViewHolder(view);
        return vh;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        holder.name.setText(Data.get(position).getMan().getName());
        holder.Birthday.setText(Data.get(position).getMan().getBday());
        holder.colorAlphabet.setBackgroundColor(Color.parseColor(Data.get(position).getColor()));
        holder.textInImg.setText(String.valueOf(Data.get(position).getMan().getName().toUpperCase().charAt(0)));
           }


    @Override
    public int getItemCount() {
        return Data.size();
    }

    private int position;

    public int getPosition() {

        return position;
    }

    public void setPosition(int position) {
        this.position = position;
    }

}
RecyclerAdapter.java

//Import Statements

public class ActivityName extends AppCompatActivity {
    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_birthdays);


        //Recycle View
        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
        mLayoutManager = new LinearLayoutManager(getApplicationContext());
        mRecyclerView.setLayoutManager(mLayoutManager);
        mAdapter = new BirthdaysListAdapter(data, this);
        mRecyclerView.setAdapter(mAdapter);


    }
//Import Statements


public class BirthdaysListAdapter extends RecyclerView.Adapter<BirthdaysListAdapter.ViewHolder> {
    static Context ctx;

    private List<typeOfData> Data;


    public BirthdaysListAdapter(List<typeOfData> list, Context context) {
        Data = list;
        this.ctx = context;

    }

    BirthdaysListAdapter() {
    }

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {
        public TextView name;
        public TextView Birthday;
        public ImageView colorAlphabet;
        public TextView textInImg;


        public ViewHolder(View v) {
            super(v);
            name = (TextView) v.findViewById(R.id.name);
            Birthday = (TextView) v.findViewById(R.id.Birthday);
            colorAlphabet = (ImageView) v.findViewById(R.id.colorAlphabet);
            textInImg = (TextView) v.findViewById(R.id.textInImg);


            v.setOnCreateContextMenuListener(this); //REGISTER ONCREATE MENU LISTENER
        }

        @Override
        public void onCreateContextMenu(ContextMenu menu, View v                         //CREATE MENU BY THIS METHOD
                                        ContextMenu.ContextMenuInfo menuInfo) {
            new BirthdaysListAdapter().info = (AdapterView.AdapterContextMenuInfo) menuInfo;
            MenuItem Edit = menu.add(Menu.NONE, 1, 1, "Edit");
            MenuItem Delete = menu.add(Menu.NONE, 2, 2, "Delete");
            Edit.setOnMenuItemClickListener(onEditMenu);
            Delete.setOnMenuItemClickListener(onEditMenu);


        }
//ADD AN ONMENUITEM LISTENER TO EXECUTE COMMANDS ONCLICK OF CONTEXT MENU TASK
        private final MenuItem.OnMenuItemClickListener onEditMenu = new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {


                DBHandler dbHandler = new DBHandler(ctx);
                List<WishMen> data = dbHandler.getWishmen();

                switch (item.getItemId()) {
                    case 1:
                        //Do stuff
                        break;

                    case 2:
                       //Do stuff

                        break;
                }
                return true;
            }
        };


    }


    public List<ViewBirthdayModel> getData() {
        return Data;
    }


    @Override
    public long getItemId(int position) {

        return super.getItemId(position);
    }


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_view_birthdays, parent, false);
        ViewHolder vh = new ViewHolder(view);
        return vh;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        holder.name.setText(Data.get(position).getMan().getName());
        holder.Birthday.setText(Data.get(position).getMan().getBday());
        holder.colorAlphabet.setBackgroundColor(Color.parseColor(Data.get(position).getColor()));
        holder.textInImg.setText(String.valueOf(Data.get(position).getMan().getName().toUpperCase().charAt(0)));
           }


    @Override
    public int getItemCount() {
        return Data.size();
    }

    private int position;

    public int getPosition() {

        return position;
    }

    public void setPosition(int position) {
        this.position = position;
    }

}
//导入语句
公共类BirthdaysListAdapter扩展了RecyclerView.Adapter{
静态上下文ctx;
私人名单数据;
公共生日sListAdapter(列表、上下文){
数据=列表;
this.ctx=上下文;
}
生日SlistAdapter(){
}
公共静态类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnCreateContextMenuListener{
公共文本视图名称;
公共文本查看生日;
公共图像视图彩色字母表;
公共文本视图文本输入;
公共视图持有者(视图v){
超级(五);
name=(TextView)v.findViewById(R.id.name);
生日=(文本视图)v.findviewbyd(R.id.birth);
colorAlphabet=(ImageView)v.findViewById(R.id.colorAlphabet);
textInImg=(TextView)v.findViewById(R.id.textInImg);
v、 setOnCreateContextMenuListener(this);//注册ONCREATE菜单侦听器
}
@凌驾
public void onCreateContextMenu(ContextMenu,View v//CREATE menu)使用此方法
ContextMenu.ContextMenuInfo menuInfo){
new BirthdaysListAdapter().info=(AdapterView.AdapterContextMenuInfo)菜单信息;
MenuItem Edit=menu.add(menu.NONE,1,1,“编辑”);
MenuItem Delete=menu.add(menu.NONE,2,2,“Delete”);
编辑.setOnMenuItemClickListener(OneEdit菜单);
Delete.setOnMenuItemClickListener(onEditMenu);
}
//添加ONMENUITEM侦听器,以便在单击上下文菜单任务时执行命令
private final MenuItem.OnMenuItemClickListener onEditMenu=新建MenuItem.OnMenuItemClickListener(){
@凌驾
公共布尔onMenuItemClick(菜单项){
DBHandler=newdbhandler(ctx);
List data=dbHandler.getWishman();
开关(item.getItemId()){
案例1:
//做事
打破
案例2:
//做事
打破
}
返回true;
}
};
}
公共列表getData(){
返回数据;
}
@凌驾
公共长getItemId(int位置){
返回super.getItemId(位置);
}
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType){
View View=LayoutInflater.from(parent.getContext()).flate(R.layout.row\u View\u birthdays,parent,false);
ViewHolder vh=新的ViewHolder(视图);
返回vh;
}
@凌驾
公共无效onBindViewHolder(最终ViewHolder,内部位置){
holder.name.setText(Data.get(position.getMan().getName());
holder.birth.setText(Data.get(position.getMan().getBday());
holder.colorAlphabet.setBackgroundColor(Color.parseColor(Data.get(position.getColor()));
holder.textInImg.setText(String.valueOf(Data.get(position.getMan().getName().toUpperCase().charAt(0));
}
@凌驾
public int getItemCount(){
返回Data.size();
}
私人职位;
public int getPosition(){
返回位置;
}
公共无效设置位置(内部位置){
这个位置=位置;
}
}

如果您想避免在适配器内手动编程定义上下文菜单,则可以使用弹出式菜单,并从正确的menu.xml将其充气

下面的示例正是这样做的,并允许您传入一个侦听器,该侦听器将在您的活动或片段中接收select和menu项,这些活动或片段首先设置此RecyclerView

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {

private List<CustomObject> objects;
private OnItemSelectedListener listener;
private final boolean withContextMenu;

class ViewHolder extends RecyclerView.ViewHolder
        implements View.OnClickListener, View.OnCreateContextMenuListener, PopupMenu.OnMenuItemClickListener {

    @BindView(R.id.custom_name)
    TextView name;

    @BindView(R.id.custom_value)
    TextView value;

    ViewHolder(View view) {
        super(view);
        ButterKnife.bind(this, view);
        view.setOnClickListener(this);
        if (withContextMenu) {
            view.setOnCreateContextMenuListener(this);
        }
    }

    @Override
    public void onClick(View v) {
        int position = getAdapterPosition();
        if (listener != null) {
            listener.onCustomerSelected(objects.get(position));
        }
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        PopupMenu popup = new PopupMenu(v.getContext(), v);
        popup.getMenuInflater().inflate(R.menu.custom_menu, popup.getMenu());
        popup.setOnMenuItemClickListener(this);
        popup.show();
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        if (listener != null) {
            CustomObject object = objects.get(getAdapterPosition());
            listener.onCustomerMenuAction(object, item);
        }
        return false;
    }
}

public CustomerAdapter(List<CustomObject> objects, OnItemSelectedListener listener, boolean withContextMenu) {
    this.listener = listener;
    this.objects = objects;
    this.withContextMenu = withContextMenu;
}

public interface OnItemSelectedListener {

    void onSelected(CustomObject object);

    void onMenuAction(CustomObject object, MenuItem item);
}

@Override
public CustomerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.snippet_custom_object_line, parent, false);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(CustomAdapter.ViewHolder holder, int position) {
    CustomObject object = objects.get(position);
    holder.name.setText(object.getName());
    holder.value.setText(object.getValue());
}

@Override
public int getItemCount() {
    return objects.size();
}
}
公共类CustomAdapter扩展了RecyclerView.Adapter{ 私有列表对象; 私密的被选中的监听器; 私有最终布尔值与上下文菜单; 类ViewHolder扩展了RecyclerView.ViewHolder 实现View.OnClickListener、View.OnCreateContextMenuListener、PopupMenu.OnMenuItemClickListener{ @BindView(R.id.custom\u名称) 文本视图名称; @BindView(R.id.custom_值) 文本视图值; 视图保持器(视图){ 超级(视图); ButterKnife.bind(这个,视图); view.setOnClickListener(这个); 如果(使用上下文菜单){ view.setOnCreateContextMenuListener(此); } } @凌驾 公共void onClick(视图v){ int position=getAdapterPosition(); if(侦听器!=null){ onCustomerSelected(objects.get(position)); } } @凌驾 public void onCreateContextMenu(ContextMenu菜单,视图v,ContextMenu.ContextMenuInfo菜单信息){ PopupMenu popup=新的PopupMenu(v。