Reputation: 15734
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
Reputation: 16010
There're 3 options:
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);
}
Use custom implementations of RecyclerView like Teovald/ContextMenuRecyclerView one
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