如何为RecyclerView创建上下文菜单

115

如何为RecyclerView实现上下文菜单?显然调用registerForContextMenu(recyclerView)无效。我是从一个片段中调用它的。有人成功实现过吗?


1
我和你一样。尝试了多种ListView方法与AdapterContextMenuInfo - 但是无法获取info.position信息。 - RoundSparrow hilltx
我认为上下文菜单的时代已经结束了。 - Binoy Babu
4
嘿,我搞定了 ;) 参考:https://dev59.com/ZHE95IYBdhLWcg3watM3 - 对于我来说,ViewHolder是onClick监听器 - 我还将其设置为OnCreateContextMenuListener。所有这些的关键在于我意识到一次只能打开一个菜单 - 所以适配器只需要一个整数来告诉它上次点击菜单的是哪个RecyclerView列表项......然后当碰到实际菜单项点击时,Fragment/Activity可以询问适配器。 - RoundSparrow hilltx
21个回答

108

感谢提供的信息和评论。我成功实现了在Recyclerview中为项目添加ContextMenu

以下是我的做法:

FragmentonViewCreated方法或ActivityonCreate方法中执行以下操作:

registerForContextMenu(mRecyclerView);

然后在适配器中添加

private int position;

public int getPosition() {
    return position;
}

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

ViewHolder 类实现 OnCreateContextMenuListener

public static class ViewHolder extends RecyclerView.ViewHolder 
        implements View.OnCreateContextMenuListener {

    public ImageView icon;

    public TextView fileName;
    public ImageButton menuButton;


    public ViewHolder(View v) {
        super(v);
        icon = (ImageView)v.findViewById(R.id.file_icon);
        fileName = (TextView)v.findViewById(R.id.file_name);
        menuButton = (ImageButton)v.findViewById(R.id.menu_button);
        v.setOnCreateContextMenuListener(this);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, 
        ContextMenu.ContextMenuInfo menuInfo) {
        //menuInfo is null
        menu.add(Menu.NONE, R.id.ctx_menu_remove_backup, 
            Menu.NONE, R.string.remove_backup);
        menu.add(Menu.NONE, R.id.ctx_menu_restore_backup,
            Menu.NONE, R.string.restore_backup);
    }
}

onBindViewHolder方法中,为holder.itemView添加OnLongClickListener以在加载上下文菜单之前捕获位置:

holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        setPosition(holder.getPosition());
        return false;
    }
});

然后在onViewRecycled中移除监听器,这样就不会有引用问题了(可能不是必须的)。

@Override
public void onViewRecycled(ViewHolder holder) {
    holder.itemView.setOnLongClickListener(null);
    super.onViewRecycled(holder);
}

最后在Fragment/Activity中覆盖onContextItemSelected,如下所示:

@Override
public boolean onContextItemSelected(MenuItem item) {
    int position = -1;
    try {
        position = ((BackupRestoreListAdapter)getAdapter()).getPosition();
    } catch (Exception e) {
        Log.d(TAG, e.getLocalizedMessage(), e);
        return super.onContextItemSelected(item);
    }
    switch (item.getItemId()) {
        case R.id.ctx_menu_remove_backup:
            // do your stuff
            break;
        case R.id.ctx_menu_restore_backup:
            // do your stuff
            break;
    }
    return super.onContextItemSelected(item);
}

1
position = ((BackupRestoreListAdapter)getAdapter()).getPosition(); --> 出现错误:方法getAdapter()在类型...中未定义,您能否展示getAdapter方法。 - nguoixanh
1
非常感谢您的建议,谢谢。 小问题:viewHolder.getPosition()已经被废弃了。 您对改进有何建议? - tm1701
11
请使用viewHolder.getAdapterPosition()代替getPosition()。 - Sagar Chavada
3
对于那些出现getAdapter()错误的人,我通过保存RecyclerView的引用来解决它,然后像这样使用它:((BackupRestoreListAdapter) recyclerView.getAdapter()).getPosition(); - Kevin Amorim
2
R.id.ctx_menu_remove_backup 究竟在哪里? - Alvin Dizon
显示剩余5条评论

107

您不能像实现onClickListenerOnContextMenuListener等方法一样直接实现它们,因为RecycleView扩展了android.view.ViewGroup。所以我们不能直接使用这些方法。

我们可以在ViewHolder适配器类中实现这些方法。我们可以像这样在RecycleView中使用上下文菜单:

public static class ViewHolder extends RecyclerView.ViewHolder implements OnCreateContextMenuListener {
    
    TextView tvTitle;
    ImageView ivImage;
    
    public ViewHolder(View v) {
        super(v);
        tvTitle =(TextView)v.findViewById(R.id.item_title);
        v.setOnCreateContextMenuListener(this);
        
        
    }
}
现在我们遵循相同的过程,同时实现上下文菜单。
@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"); 
    
}
如果您遇到任何困难,请在评论区提问。

10
好的,那么我们需要在活动/片段级别上实现一个 onContextItemSelectedgetTitle 可以正常工作,getItemId 也可以正常工作,但是 getMenuInfo 返回 null。那么,如何获取 ViewHolder - Michael Schmidt
7
经过一些实验,我也无法使它正常工作,在onContextItemSelected()getMenuInfo()返回空值。也许那些成功的人恰好在层次结构的更高视图(RecyclerViewFragment)中具有onCreateContextMenu()方法?这可能有效,但会引导我们查看这个问题的其他答案。 - NeilS
要获取更多关于如何实现此操作的信息,请访问此处:http://androidheight.blogspot.co.ke/2015/03/recyclerview-widget-example-in-android.html - Evans Murithi
3
Prabhakbar,您没有提到如何获取所点击的项目和视图? - Benjamin Stürmer
6
你可以使用 menu.add(this.getAdapterPosition(), v.getId(), 0, "Call");,然后在回调方法中测试 item.getGroupId() 来获取位置。 - JacobPariseau
显示剩余11条评论

34

当前答案不正确。这里是一个可用的实现:

public class ContextMenuRecyclerView extends RecyclerView {

  private RecyclerViewContextMenuInfo mContextMenuInfo;

  @Override
  protected ContextMenu.ContextMenuInfo getContextMenuInfo() {
    return mContextMenuInfo;
  }

  @Override
  public boolean showContextMenuForChild(View originalView) {
    final int longPressPosition = getChildPosition(originalView);
    if (longPressPosition >= 0) {
        final long longPressId = getAdapter().getItemId(longPressPosition);
        mContextMenuInfo = new RecyclerViewContextMenuInfo(longPressPosition, longPressId);
        return super.showContextMenuForChild(originalView);
    }
    return false;
  }

  public static class RecyclerViewContextMenuInfo implements ContextMenu.ContextMenuInfo {

    public RecyclerViewContextMenuInfo(int position, long id) {
        this.position = position;
        this.id = id;
    }

    final public int position;
    final public long id;
  }
}
在您的片段(或活动)中:
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mRecyclerView = view.findViewById(R.id.recyclerview);
    registerForContextMenu(mRecyclerView);
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    // inflate menu
    MenuInflater inflater = getActivity().getMenuInflater();
    inflater.inflate(R.menu.my_context_menu, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    return super.onContextItemSelected(item);
    RecyclerViewContextMenuInfo info = (RecyclerViewContextMenuInfo) item.getMenuInfo();
    // handle menu item here
}

最后,在您的 ViewHolder 中:

class MyViewHolder extends RecyclerView.View.ViewHolder {
    ...
    private void onLongClick() {
        itemView.showContextMenu();
    }
}

1
注意:抱歉,我忘记了添加:getChildPosition()已在com.android.support:recyclerview-v7:22.0.0中被弃用。 - Juan José Melero Gómez
1
这个不起作用。你不能从RecyclerView.View.ViewHolder访问getView().showContextMenu()。 - Mulgard
RecyclerViewContextMenuInfo info = (RecyclerViewContextMenuInfo) item.getMenuInfo(); info为空。我该怎么办? - Douglas Fornaro
5
这对我很有效。但是在 MyViewHolder 中没有必要使用 onLongClick(),在构造函数中设置 itemView.setLongClickable(true) 就足够了,当未注册 OnLongClickListener 时,上下文菜单将会出现。 - alders
2
重要提示:在将RecyclerView扩展为ContextMenuRecyclerView时,不要忘记添加IDE建议的构造函数。特别是,如果您没有实现接受Context和AttributeSet两个参数的构造函数,则Android将无法填充您的布局XML。 - lidkxx
显示剩余3条评论

30

在recycleView中尝试这个View项目

.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            menu.add("delete").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {

                    //do what u want
                    return true;
                }
            });
        }
    });

您可以将数据设置到ViewHolder项中并使用它。


在可回收视图内的图像视图上下文菜单所需的正是我需要的。 - Themos
3
只适用于 Android API 23 及以上版本。 - SWoo
@SWoo 以上代码中哪一部分需要API 23或更高版本? - AJW

16

Prabhakar的答案是正确的,但他没有解释如何获取与选定上下文菜单项相关联的数据。我们可以使用onContextItemSelected回调,但在这种情况下(如果未为按下的视图重写getContextMenuInfo()方法),ContextMenuInfo不可用(null)。因此,最简单的解决方案是直接将OnMenuItemClickListener添加到MenuItem中。

private class ViewHolder extends RecyclerView.ViewHolder {
    private final TextView mTitleTextView;
    private MyItemData mData;

    public ViewHolder(View view) {
        super(view);

        mTitleTextView = (TextView)view.findViewById(R.id.title);

        view.setOnCreateContextMenuListener(mOnCreateContextMenuListener);
    }

    public void bind(@NonNull MyItemData data) {
         mData = data;

         String title = mData.getTitle();
         mTitleTextView.setText(title);
    }

    private final View.OnCreateContextMenuListener mOnCreateContextMenuListener = new View.OnCreateContextMenuListener() {
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            if (mData!= null) {
                MenuItem myActionItem = menu.add("My Context Action");
                myActionItem.setOnMenuItemClickListener(mOnMyActionClickListener);
            }
        }
    };

    private final MenuItem.OnMenuItemClickListener mOnMyActionClickListener = new MenuItem.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            //todo: process item click, mData is available here!!!
            return true;
        }
    };
}

1
请清楚地解释您的代码片段是如何工作的。仅仅复制粘贴代码是不够的,即使它很有价值。 - peterh
如果您不想创建自定义的RecyclerView子类来覆盖getContextMenuInfo等,那么这似乎是一个合理的折衷方案,即使它不像让片段/活动处理点击那样高效。监听器将可以访问持有者中的数据,因此您不应该需要位置。理论上,您可以在绑定时缓存位置,并使用委托从您的持有者中调用,尽管有时使用其中一个绑定视图的Context就足够了。 - qix

13

这里是在RecyclerView项上使用菜单上下文的简洁方法

首先,您需要一个项位置

在Adapter类中:

 /**
 * Custom on long click item listener.
 */
OnLongItemClickListener mOnLongItemClickListener;

public void setOnLongItemClickListener(OnLongItemClickListener onLongItemClickListener) {
    mOnLongItemClickListener = onLongItemClickListener;
}

public interface OnLongItemClickListener {
    void itemLongClicked(View v, int position);
}

onBindViewHolder 中挂接自定义监听器:

        // Hook our custom on long click item listener to the item view.
        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if (mOnLongItemClickListener != null) {
                    mOnLongItemClickListener.itemLongClicked(v, position);
                }

                return true;
            }
        });

在MainActivity(Activity/Fragment)中创建一个字段:

private int mCurrentItemPosition;

在您的 Adapter 对象中设置自定义监听器:

    mAdapter.setOnLongItemClickListener(new FileAdapter.OnLongItemClickListener() {
        @Override
        public void itemLongClicked(View v, int position) {
            mCurrentItemPosition = position;
        }
    });

现在您可以为长按选择的任何项目设置一个美味的位置

第二步,创建菜单

在res->menu中创建一个包含您的菜单项context_menu_main.xml的文件:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/delete" android:title="Delete"/>
<item android:id="@+id/share" android:title="Share"/>
</menu>

在MainActivity中: 实现onCreateContextMenuonContextItemSelected两个方法:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context_menu_main, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.delete) {

    }

    if (id == R.id.share) {

    }

    return true;
}

第三步,回到您的适配器对象

  1. 注册您的上下文菜单。

  2. 显示上下文菜单。

 registerForContextMenu(mRecyclerView);
 mAdapter.setOnLongItemClickListener(new FileAdapter.OnLongItemClickListener() {
     @Override
     public void itemLongClicked(View v, int position) {
         mCurrentItemPosition = position;
         v.showContextMenu();
     }
 });

希望我没有遗漏任何事项

更多信息请参阅菜单文档


谢谢!如何将数据传递给上下文菜单?例如,项目ID、项目文本等。 - CoolMind
这个解决方案对我来说最好用。但是在适配器的holder.view.setOnLongClickListener中最好返回false,而不是在活动/片段中调用v.showContextMenu()...这样可以呈现更好的上下文菜单,而不是对话框。 - davejoem
v.showContextMenu(view.getPivotX(), view.getPivotY()); 的效果更好。 - Antares

12

这里有一个使用Kotlin的更简单方法,适用于我。主要挑战是找出所按的项目的位置。在您的适配器内,您可以放置此代码片段,它将能够捕获显示上下文菜单的项目的位置;就是这样。

override fun onBindViewHolder(holder: YourViewHolder, position: Int) {

...     

    holder.view.setOnCreateContextMenuListener { contextMenu, _, _ -> 
            contextMenu.add("Add").setOnMenuItemClickListener {
                    longToast("I'm pressed for the item at position => $position")
                    true    
            }       
    }       

} 

2
这是最自然和可控的方法。 - nima
1
这是最简洁的方式。 - ngoson
3
将监听器放置在onBindViewHolder中是一种不良的做法。你应该将它们放置在onCreateViewHolder中并调用holder.getAbsoluteAdapterPosition()。 - Rondev

11

@Renaud的回答对我有用,但需要先进行几次代码修复。就像他发布了来自他代码的不同迭代的代码片段一样。需要进行的更改是:

  • RecyclerContextMenuInfoRecyclerViewContextMenuInfo 是相同的类。选择一个名称并坚持使用它。
  • ViewHolder 必须实现 View.OnLongClickListener,并记得在构造函数中调用 setOnLongClickListener()
  • onLongClick() 监听器中,getView().showContextMenu() 完全错误。必须在你的 ContextMenuRecyclerView 中调用 showContextMenuForChild(),否则你在 onCreateContextMenu()onContextItemSelected() 中获得的 ContextMenuInfo 将为 null。

我的编辑后的代码如下:

ContextMenuRecyclerView:

public class ContextMenuRecyclerView extends RecyclerView {

    private RecyclerViewContextMenuInfo mContextMenuInfo;

    @Override
    protected ContextMenu.ContextMenuInfo getContextMenuInfo() {
        return mContextMenuInfo;
    }

    @Override
    public boolean showContextMenuForChild(View originalView) {
        final int longPressPosition = getChildPosition(originalView);
        if (longPressPosition >= 0) {
            final long longPressId = getAdapter().getItemId(longPressPosition);
                mContextMenuInfo = new RecyclerViewContextMenuInfo(longPressPosition, longPressId);
            return super.showContextMenuForChild(originalView);
        }
        return false;
    }

    public static class RecyclerViewContextMenuInfo implements ContextMenu.ContextMenuInfo {

        public RecyclerViewContextMenuInfo(int position, long id) {
            this.position = position;
            this.id = id;
        }

        final public int position;
        final public long id;
    }
}

在你的片段中:

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mRecyclerView = view.findViewById(R.id.recyclerview);
    registerForContextMenu(mRecyclerView);
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    // inflate menu here
    // If you want the position of the item for which we're creating the context menu (perhaps to add a header or something):
    int itemIndex = ((ContextMenuRecyclerView.RecyclerViewContextMenuInfo) menuInfo).position;
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    ContextMenuRecyclerView.RecyclerViewContextMenuInfo info = (ContextMenuRecyclerView.RecyclerViewContextMenuInfo) item.getMenuInfo();
    // handle menu here - get item index or ID from info
    return super.onContextItemSelected(item);
}

在您的ViewHolder中:

class MyViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener {

    public MyViewHolder( View itemView ) {
        super( itemView );
        itemView.setOnLongClickListener( this );
    }

    @Override public boolean onLongClick() {
        recyclerView.showContextMenuForChild( v );
        return true;
    }
}

另外,请确保在您的布局中将RecyclerView替换为ContextMenuRecyclerView


1
感谢@josh2112指出我的错别字,我已经更正了它们 - 但是关于你最后的观点,你可以用itemView.showContextMenu()替换recyclerView.showContextMenuForChild(itemView); - Renaud Cerrato
1
重要提示:在将RecyclerView扩展为ContextMenuRecyclerView时,不要忘记添加IDE建议的构造函数。特别是,如果您没有实现接受Context和AttributeSet两个参数的构造函数,则Android将无法填充您的布局XML。 - lidkxx

4

针对那些在调用ContextMenu时想要获取项目ID的人提供的解决方案。

如果您有一个包含可点击ImageView的项目的RecyclerView,如下所示:

list

那么您应该从onClickListener中接收回调。

适配器

class YourAdapter(private val contextMenuCallback: ContextMenuCallback) :
    RecyclerView.Adapter<YourAdapter.ViewHolder>() {

    private var items: MutableList<Item> = mutableListOf()

    ...

    override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
        val item = items[position] as Item
        updateItem(viewHolder, item)

        setOnClickListener(viewHolder.itemView, items[position].id, items[position].title)
    }

    private fun setOnClickListener(view: View, id: Int, title: String) {
//        view.setOnClickListener { v ->  }
        // A click listener for ImageView `more`.
        view.more.setOnClickListener {
            // Here we pass item id, title, etc. to Fragment.
            contextMenuCallback.onContextMenuClick(view, id, title)
        }
    }


    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val titleTextView: TextView = itemView.title
    }

    class Item(
        val id: Int,
        val title: String
    )

    interface ContextMenuCallback {
        fun onContextMenuClick(view: View, id: Int, title: String)
    }
}

片段

class YourFragment : Fragment(), YourAdapter.ContextMenuCallback {

    private var adapter: YourAdapter? = null
    private var linearLayoutManager: LinearLayoutManager? = null
    private var selectedItemId: Int = -1
    private lateinit var selectedItemTitle: String


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        adapter = YourAdapter(this)
        view.recycler_view.apply {
            layoutManager = linearLayoutManager
            adapter = this@YourFragment.adapter
            setHasFixedSize(true)
        }

        registerForContextMenu(view.recycler_view)
    }

    override fun onCreateContextMenu(menu: ContextMenu?, v: View?,
                                     menuInfo: ContextMenu.ContextMenuInfo?) {
        activity?.menuInflater?.inflate(R.menu.menu_yours, menu)
    }

    override fun onContextItemSelected(item: MenuItem?): Boolean {
        super.onContextItemSelected(item)
        when (item?.itemId) {
            R.id.action_your -> yourAction(selectedItemId, selectedItemTitle)
            ...
        }
        return true
    }

    override fun onContextMenuClick(view: View, id: Int, title: String) {
        // Here we accept item id, title from adapter and show context menu.
        selectedItemId = id
        selectedItemTitle = title
        view.showContextMenu()
    }
}

警告!

如果您使用基于一个片段的ViewPager(所有页面都是类似的列表),您将面临一个问题。当您重写onContextItemSelected以了解选择了哪个菜单项时,您将从第一页获取列表项ID!要克服这个问题,请参见ViewPager中错误的片段接收onContextItemSelected调用


3

我可能来晚了,但我有一个有效的解决方案。

我为此创建了一个代码片段。

在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);


    }

RecyclerAdapter.java

//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;
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接