好的,所以我(令人惊讶地)设法在这里回答了我自己的问题。
为了使用PopupMenu 从onMenuItemClicked 内的RecylcerView 适配器获取位置,我创建了PopupMenu 的自定义实现。
这样做可以在使用PopupMenu(例如displaying icons in your menus)时提供更大的灵活性。
查看 Google 的 PopupMenu 源代码,并创建自己的源代码,类似于 MyPopupMenu 的代码完全相同,但您可以修改该类可以执行的某些实例。
为了完成我的问题,我在RecyclerView.Adapter 的“更多”按钮中添加了一个OnClickListener。单击时,按钮调用一个接口方法,该方法同时传递按钮视图和适配器的当前位置。
在MyPopupMenu的自定义实现中,为每个构造函数添加一个int值的变量要求。还要在MyPopupMenu内的接口方法onMenuItemClick(MenuItem item, int position)中添加int position。
最后,在活动类中组装。
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);
}
}
让我知道你们的想法!