Android 如何在firebaseui提供的recyclerview项上使用上下文菜单

Android 如何在firebaseui提供的recyclerview项上使用上下文菜单,android,android-recyclerview,navigation-drawer,firebaseui,android-contextmenu,Android,Android Recyclerview,Navigation Drawer,Firebaseui,Android Contextmenu,我想知道如何在FirebaseUI提供的recyclerview项中放置contextmenu,并能够在知道长按哪个项的情况下执行一些操作。因为当我尝试在holder类上使用onCreateContextMenu时,ContextMenuInfo带有空值。 这是我的课程: public class PlayerHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener { //pri

我想知道如何在FirebaseUI提供的recyclerview项中放置contextmenu,并能够在知道长按哪个项的情况下执行一些操作。因为当我尝试在holder类上使用onCreateContextMenu时,ContextMenuInfo带有空值。 这是我的课程:

public class PlayerHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {
    //private static final String TAG = PlayerHolder.class.getSimpleName();
    public TextView playerName;
    public TextView playerAge;

    public PlayerHolder(View itemView) {
        super(itemView);
        playerName = (TextView) itemView.findViewById(R.id.player_name);
        playerAge = (TextView) itemView.findViewById(R.id.player_age);
        itemView.setOnCreateContextMenuListener(this);
    }

    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        menu.add(0, 1, 0, "Edit");//groupId, itemId, order, title
        menu.add(0, 2, 0, "Share");
        menu.add(0, 3, 0, "Delete");
    }

    //@Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView .AdapterContextMenuInfo) item.getMenuInfo();
        switch (item.getItemId()) {
            case 1:
                //editNote(info.id);
                return true;
            case 2:
                //shareNote(info.id);
                return true;
            case 3:
                //deleteNote(info.id);
                return true;
            default:
                //return super.onContextItemSelected(item);
                return false;
        }
    }
}
这是我的firebaseui回收器适配器类

public class PlayerAdapter extends FirebaseRecyclerAdapter<Player, PlayerHolder> {

    private static final String TAG = PlayerAdapter.class.getSimpleName();
    private Context context;

    public PlayerAdapter(Class<Player> modelClass, int modelLayout, Class<PlayerHolder> viewHolderClass, DatabaseReference ref, Context context) {
        super(modelClass, modelLayout, viewHolderClass, ref);
        this.context = context;
    }

    @Override
    protected void populateViewHolder(PlayerHolder viewHolder, Player model, int position) {

        viewHolder.playerName.setText(model.getName());
        viewHolder.playerAge.setText(String.valueOf(playerAge) + " Years");
    }
}
公共类PlayerAdapter扩展了FirebaseRecyclerAdapter{
私有静态最终字符串标记=PlayerAdapter.class.getSimpleName();
私人语境;
公共播放器适配器(类modelClass、int modelLayout、类viewHolderClass、数据库引用、上下文){
超级(modelClass、modelLayout、viewHolderClass、ref);
this.context=上下文;
}
@凌驾
受保护的void populateViewHolder(播放者文件夹viewHolder,播放器型号,int位置){
viewHolder.playerName.setText(model.getName());
viewHolder.playerAge.setText(String.valueOf(playerAge)+“年”);
}
}

我通过在本文中使用此解决方案解决了此问题:

这是我的密码:

MessageViewHolder类别:

public static class MessageViewHolder extends RecyclerView.ViewHolder  implements View.OnCreateContextMenuListener {
        public TextView tvMessage;
        public TextView tvDateSending;
        public CircleImageView ivMessenger;
        public LinearLayout linearLayout;


        public MessageViewHolder(View v) {
            super(v);
            tvMessage = (TextView) itemView.findViewById(R.id.tvMessage);
            tvDateSending = (TextView) itemView.findViewById(R.id.tvDateSending);
            ivMessenger = (CircleImageView) itemView.findViewById(R.id.ivMessenger);
            linearLayout= (LinearLayout) itemView.findViewById(R.id.llOneToOneChat);
            v.setOnCreateContextMenuListener(this);

        }
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            menu.add(0,1 , 0, "Edit");
            menu.add(0, COPY, 0, "Copy");
            menu.add(0, DELETE, 0, "Delete");
        }

    }
消息适配器类:

public class MessageAdapter extends FirebaseRecyclerAdapter<Message, MessageViewHolder>{

        private Context context;
        private long prevMessageTime=0;
        public int position;

        public int getPosition() {
            return position;
        }

        public void setPosition(int position) {
            this.position = position;
        }

        public MessageAdapter(Class<Message> modelClass, int modelLayout, Class<MessageViewHolder> viewHolderClass, DatabaseReference ref, Context context) {
            super(modelClass, modelLayout, viewHolderClass, ref);
            this.context = context;
        }

        @Override
        protected void populateViewHolder(MessageViewHolder viewHolder, Message message, final int position) {
            //do something
            viewHolder.tvMessage.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    setPosition(position);
                    return false;
                }

            });
        }
    }

希望它对你有用

这是我在这里的第二个问题,所以我没有经验,如果你需要其他信息或任何东西,请随时询问。谢谢你,但现在我有另一个问题,我的菜单信息是空的。我会寻找解决办法的。thx无论如何都是信息。这是什么意思?ContextMenu.ContextMenuInfo menuInfo from onCreateContextMenu,它应该保存所选的视图信息。我认为该位置足以从数据数组中获取数据
@Override
    public boolean onContextItemSelected(MenuItem item) {
        int position = -1;
        try {
            position = messageAdapter.getPosition();
        } catch (Exception e) {
//            Log.d(TAG, e.getLocalizedMessage(), e);
            return super.onContextItemSelected(item);
        }
        switch (item.getItemId()) {
            case 1:
                // do your stuff

                break;
            case 2:
                // copy message
                if (position!= -1){
                    ClipboardManager clipboard = (ClipboardManager) OneToOneConversationActivity.this.getSystemService(Context.CLIPBOARD_SERVICE);
                    String text = messageAdapter.getItem(position).getMessage();
                    ClipData clip = android.content.ClipData.newPlainText("Copied Text", text);
                    clipboard.setPrimaryClip(clip);

                }

                break;
            case 3:
                //delete message
                if (position!= -1)
                    messageAdapter.getRef(position).removeValue();
                break;
        }
        return super.onContextItemSelected(item);
    }