2

i would like to know how to put an contextmenu within an recyclerview item provided by FirebaseUI and be able to do some actions knowing wich item was long pressed. Because when i try to use onCreateContextMenu on my holder class my ContextMenuInfo comes with null value. here is my holder class:

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;
        }
    }
}

and this is my firebaseui recycler adapter class

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");
    }
}
A Goncalves
  • 23
  • 1
  • 5
  • This is my second question here so im not experienced, if you need another info or anything feel free to ask. Thanks in advance – A Goncalves Oct 21 '16 at 20:58

1 Answers1

5

I've resolved this problem by use this solution in this post: How to create context menu for recycleview

Here is my code:

MessageViewHolder Class:

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");
        }

    }

MessageAdapter class:

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;
                }

            });
        }
    }

Finally in the Fragment/Activity override the onContextItemSelected as under:

@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);
    }

Hope it works for you!

Community
  • 1
  • 1
My Will
  • 400
  • 4
  • 27