RecyclerView添加ContextMenu的两种方案详解

本文详细介绍了在Android中使用RecyclerView添加ContextMenu的两种方法。方案一涉及在RecyclerView的子项布局设置longClickable属性,重载onCreateContextMenu和onContextItemSelected方法,并创建RecyclerViewWithContextMenu类。方案二则是在Adapter中实现position变量,ViewHolder实现OnCreateContextMenuListener接口,以及在onBindViewHolder和onViewRecycled中处理长按监听。
摘要由CSDN通过智能技术生成

RecyclerView+ContextMenu实现的技术难点主要是在RecyclerView中获取被点击item的position,本文一共给出了两种解决方案:

方案一:
从onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)方法传递进来的menuInfo中获取到相应的position信息。

方案二:
从RecyclerView的Adapter入手,在Adapter的ViewHolder中为每个itemView设置setOnLongClickListener监听,然后在长按监听回调中设置当前的position,为每个itemView设置setOnCreateContextMenuListener监听,通过上面记录的position来执行相应的动作。

一、方案一实现步骤:

RecyclerView+ContextMenu实现菜单项和ListView添加ContextMenu的步骤差不多,但要注意的是,从onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)方法传递进来的menuInfo为null,为什么为null值呢?因为RecyclerView并没有像ListView一样给我们重写View.getContextMenuInfo()这个方法,所以返回的是默认值null,(翻翻源码很容易就找到了),所以我们可以参考AbsListView类中对mContextMenuInfo对象的相关操作,重载RecyclerView类的showContextMenuForChild和getContextMenuInfo方法派生RecyclerViewWithContextMenu类。其中,在showContextMenuForChild方法中通过RecyclerView对应的LayoutManager方法获取到item的位置信息,并赋值给自定义的菜单附加信息类的对象。然后,在getContextMenuInfo方法中返回这个对象。这样上下文菜单被创建的时候就会在onCreateContextMenu方法的menuInfo对象中获得到传递的附加信息。

1.1 在RecyclerView中的的item布局设置longClickable属性

在RecyclerView中的的item布局设置longClickable属性,这样在长按item的时候才能弹出ContextMenu。注意:必须而且仅能在最外层布局中设置允许长按。

//代码设置
rl.setLongClickable(true);

//xml中设置
android:longClickable="true"

1.2 重载onCreateContextMenu

可以Activity中使用registerForContextMenu(view)注册需要上下文菜单的View,然后重载onCreateContextMenu方法,也可以在需要用到上下文菜单的View中设置setOnCreateContextMenuListener监听器来监听onCreateContextMenu事件的产生。这两种方法都可以实现,只要用其中一种即可。
方法一:registerForContextMenu(view)

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        ...
        registerForContextMenu(mRvUserList);
        ...
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    
        RecyclerViewWithContextMenu.RecyclerViewContextInfo contextMenuInfo = (RecyclerViewWithContextMenu.RecyclerViewContextInfo) menuInfo;
        if(contextMenuInfo!=null && contextMenuInfo.getPosition()>=0){
    
            UserAdapter adapter=(UserAdapter)mRvUserList.getAdapter();
            mSelectModelUser = adapter.getItem(contextMenuInfo.getPosition());
            menu.setHeaderTitle(mSelectModelUser.getUserName());
            CreateMenu(menu);
        }
    }

    public void CreateMenu(Menu menu)
    {
    
        int groupID = 0;
        int order = 0;
        int[] itemID = {
    1,2};

        for(int i=0;i<itemID.length;i++)
        {
    
            switch(itemID[i])
            {
    
                case 1:
                    menu.add(groupID, itemID[i], order, "编辑");
                    break;
                case 2:
                    menu.add(groupID, itemID[i], order, "删除");
                    break;
                default:
                    break;
            }
        }
    }

方法二:view…setOnCreateContextMenuListener

        mRvUserList.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
    
            @Override
            public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    
                RecyclerViewWithContextMenu.RecyclerViewContextInfo contextMenuInfo = (RecyclerViewWithContextMenu.RecyclerViewContextInfo) menuInfo;
                if(contextMenuInfo!=null && contextMenuInfo.getPosition()>=0){
    
                    UserAdapter adapter=(UserAdapter)mRvUserList.getAdapter();
                    mSelectModelUser = adapter.getItem(contextMenuInfo.getPosition());
                    menu.setHeaderTitle(mSelectModelUser.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值