How to create context menu for RecyclerView

后端 未结 21 2683
日久生厌
日久生厌 2020-11-28 01:20

How do I implement context menu for RecyclerView? Apparently calling registerForContextMenu(recyclerView) doesn\'t work. I\'m calling it from a fra

21条回答
  •  栀梦
    栀梦 (楼主)
    2020-11-28 02:02

    I have combined my solution with the solution from @Hardik Shah:

    In the activity I have:

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        if (v.getId() == R.id.rvQuests) {
            getMenuInflater().inflate(R.menu.list_menu, menu);
        }
    }
    

    In the Adapter I have:

    private MainActivity context;
    private int position;
    
    public int getPosition() {
        return position;
    }
    
    public void setPosition(int position) {
        this.position = position;
    }
    
    public QuestsAdapter(MainActivity context, List objects) {
        this.context = context;
        this.quests.addAll(objects);
    }
    
    public class QuestViewHolder extends RecyclerView.ViewHolder {
        private QuestItemBinding questItemBinding;
    
        public QuestViewHolder(View v) {
            super(v);
            questItemBinding = DataBindingUtil.bind(v);
            v.setOnCreateContextMenuListener(context);
        }
    }
    
    @Override
    public void onBindViewHolder(final QuestViewHolder holder, int position) {
        Quest quest = quests.get(position);
        holder.questItemBinding.setQuest(quest);
        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                setPosition(holder.getAdapterPosition());
                return false;
            }
        });
    }
    
    @Override
    public void onViewRecycled(QuestViewHolder holder) {
        holder.itemView.setOnLongClickListener(null);
        super.onViewRecycled(holder);
    }
    

    In fragment I have:

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        int position = ((QuestsAdapter) questsList.getAdapter()).getPosition();
        switch (item.getItemId()) {
            case R.id.menu_delete:
                Quest quest = questsAdapter.getItem(position);
                App.getQuestManager().deleteQuest(quest);
                questsAdapter.remove(quest);
                checkEmptyList();
                return true;
            default:
                return super.onContextItemSelected(item);
        }
    }
    

提交回复
热议问题