通常对于ListViews
,当我想获得用户点击上下文菜单的位置时,我会这样做。
public boolean onContextItemSelected(android.view.MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
position = info.position;
然而,自从我切换到RecycleView
后,我现在在这里得到一个空指针。
上面的代码位于我的主Activity
(Fragment
),而onCreateContextMenu()
按照新方式在adapter
完成。
ItemView.setOnCreateContextMenuListener(this);
也在适配器中完成(特别是构造函数)。
答案 0 :(得分:8)
有3种选择:
您可以传递getAdapterPosition()
代替MenuItem
的订单
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");
}
}
然后,在Activity
中收听onContextItemSelected()
并按getOrder()
@Override
public boolean onContextItemSelected(MenuItem item) {
int clickedItemPosition = item.getOrder();
// do something!
return super.onContextItemSelected(item);
}
使用RecyclerView的自定义实现,例如Teovald/ContextMenuRecyclerView一个
设置MenuItem
的clickListener(请参阅https://stackoverflow.com/a/33179957/1658267)并在那里处理。
是的,这是非常不方便的API。你可以选择你最喜欢的那个。