5

Normally for ListViews, I would do this when I wanted to get the position that the user clicked on a Context Menu.

public boolean onContextItemSelected(android.view.MenuItem item) {

    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    position = info.position;

However, ever since I switched to a RecycleView, I now get a null pointer here.

The code above is in my main Activity (Fragment) while onCreateContextMenu() is done in the adapter as per the new way.

ItemView.setOnCreateContextMenuListener(this); is also done in the adapter (specifically the constructor).

TheLettuceMaster
  • 15,594
  • 48
  • 153
  • 259

1 Answers1

15

There're 3 options:

  1. You can pass getAdapterPosition() instead of MenuItem's order

    private class ChipViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {
        public ChipViewHolder(View itemView) {
            super(itemView);
            itemView.setOnCreateContextMenuListener(this);
        }
    
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            menu.setHeaderTitle("Select The Action");
            menu.add(0, ACTION_1_ID, getAdapterPosition(), "action 1");
            menu.add(0, ACTION_2_ID, getAdapterPosition(), "action 2");
        }
    }
    

    And then, in Activity listen to onContextItemSelected() and retrieve position by getOrder()

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        int clickedItemPosition = item.getOrder();
        // do something!
        return super.onContextItemSelected(item);
    }
    
  2. Use custom implementations of RecyclerView like Teovald/ContextMenuRecyclerView one

  3. Setting MenuItem's clickListener (see https://stackoverflow.com/a/33179957/1658267 ) and handles it there.

Yes, it's very inconvenient API. You can choose the one you like most.

Community
  • 1
  • 1
Konstantin Loginov
  • 15,802
  • 5
  • 58
  • 95
  • Option #1 did the trick. All I had to do was add one line of code (and replace what I had above) in the Activity; everything else was set up. Thanks again. – TheLettuceMaster Jan 04 '16 at 22:22