获取在 RecycleView 中选中的 ContextMenu 的位置

Get Position of ContextMenu Selected in RecycleView

通常 ListViews,当我想获取用户在上下文菜单上单击的位置时,我会这样做。

public boolean onContextItemSelected(android.view.MenuItem item) {

    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    position = info.position;

但是,自从我切换到 RecycleView,我 现在在这里得到一个空指针

上面的代码在我的主 Activity (Fragment) 中,而 onCreateContextMenu() 是在 adapter 中按照新的方式完成的。

ItemView.setOnCreateContextMenuListener(this);也是在适配器中完成的(特别是构造函数)。

有 3 个选项:

  1. 你可以通过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);
    }
    
  2. 使用 RecyclerView 的自定义实现,例如 Teovald/ContextMenuRecyclerView one

  3. 设置 MenuItem 的 clickListener(参见 )并在那里进行处理。

是的,很不方便API。你可以选择你最喜欢的。