Хорошо, поэтому я (удивительно) смог ответить на мой собственный вопрос здесь.
Для того, чтобы получить позицию из RecylcerView
адаптера в onMenuItemClicked
с помощью PopupMenu
, я создал пользовательскую реализацию PopupMenu
.
Это обеспечивает гораздо большую гибкость при использовании PopupMenu
, например displaying icons in your menus.
Посмотрите на исходный код Google для PopupMenu
и создайте свой собственный, что-то вроде MyPopupMenu
, что точно так же, но вы можете изменить некоторые экземпляры того, что класс может сделать.
Чтобы решить эту проблему, я добавил OnClickListener
к кнопке More в моем RecyclerView.Adapter
. При нажатии кнопки вызывается метод интерфейса, который передает как представление кнопки, так и текущую позицию адаптера.
В пользовательской реализации MyPopupMenu
добавьте требования к переменной для каждого конструктора для значения int. Также добавьте int position
к способу интерфейса onMenuItemClick(MenuItem item, int position)
в пределах MyPopupMenu
.
Наконец, соберите в классе активности.
public class MyActivity extends AppCompatActivity implements MyAdapter.OnItemEventListener, PopupMenu.OnMenuItemClickListener {
@Override
public void onMoreClicked(View v, int position) {
MyPopupMenu popupMenu = new MyPopupMenu(this, v, position);
MenuInflater inflater = popupMenu.getMenuInflater();
inflater.inflate(R.menu.edit_delete_menu, popupMenu.getMenu());
popupMenu.setOnMenuItemClickListener(this);
popupMenu.show();
}
@Override
public boolean onMenuItemClick(MenuItem item, int position) {
switch (item.getItemId()) {
case R.id.edit:
//Do position specific action with int position
break;
case R.id.delete:
//Do position specific action with int position
break;
}
return false;
}
}
class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private final OnItemEventListener onItemEventListener;
static class ViewHolder extends RecyclerView.ViewHolder {
ImageButton more;
ViewHolder(View v) {
super(v);
more = (ImageButton) v.findViewById(R.id.list_item_more_button);
}
}
public NewGameAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
final ViewHolder viewHolder = new ViewHolder(v);
viewHolder.more.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onItemEventListener.onMoreClicked(viewHolder.more, viewHolder.getAdapterPosition());
}
});
return viewHolder;
}
interface OnItemEventListener {
void onMoreClicked(View v, int position);
}
}
Дайте мне знать, что вы думаете, ребята!