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

时间:2016-01-04 18:07:07

标签: android nullpointerexception android-recyclerview adapter contextmenu

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

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

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

然而,自从我切换到RecycleView后,我现在在这里得到一个空指针

上面的代码位于我的主ActivityFragment),而onCreateContextMenu()按照新方式在adapter完成。

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

1 个答案:

答案 0 :(得分:8)

有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一个

  3. 设置MenuItem的clickListener(请参阅https://stackoverflow.com/a/33179957/1658267)并在那里处理。

  4. 是的,这是非常不方便的API。你可以选择你最喜欢的那个。