TheLettuceMaster
TheLettuceMaster

Reputation: 15734

Get Position of ContextMenu Selected in RecycleView

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).

Upvotes: 6

Views: 3387

Answers (1)

Konstantin Loginov
Konstantin Loginov

Reputation: 16010

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.

Upvotes: 15

Related Questions