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

问题描述:

我想知道如何在FirebaseUI提供的recyclerview项目中放置一个contextmenu,并且能够执行一些知道该项目被长时间按下的操作。因为当我尝试在持有者类上使用onCreateContextMenu时,我的ContextMenuInfo带有空值。 这里是我的holder类:如何使用firebaseui提供的recyclerview项目的上下文菜单

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

这是我的第二个问题,所以即使没有经验,如果你需要其他信息或任何东西随意问。在此先感谢 –

我已经解决了这个问题,通过使用在这篇文章中此解决方案: How to create context menu for recycleview

这里是我的代码:

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

    } 

MessageAdapter类:

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

      }); 
     } 
    } 

最后的片段/活动覆盖onContextItemSelected如下:

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

希望工程为您服务!

+0

它工作谢谢,但现在有另一个问题,我的menuInfo为空。我会寻找任何解决方案。 thx反正 –

+0

menuInfo。这是什么意思? –

+0

ContextMenu.ContextMenuInfo来自onCreateContextMenu的menuInfo,它应该保存选定的视图信息。 –