2

FirebaseUI에서 제공하는 recyclerview 항목에 contextmenu를 넣는 방법을 알고 싶습니다. 항목을 길게 누르면 일부 작업을 수행 할 수 있습니다. 왜냐하면 나는 holder 클래스에서 onCreateContextMenu를 사용하려고 할 때 ContextMenuInfo가 null 값을 제공하기 때문입니다. 여기 내 홀더 클래스입니다 :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

다른 정보가 필요하거나 무엇이든 물어볼 필요가 있으면 여기는 두 번째 질문입니다. 경험이 없습니다. 미리 감사드립니다 –

답변

2

입니다 : 여기 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; 
       } 

      }); 
     } 
    } 

오버라이드 (override)는 아래로을 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는 null입니다. 나는 해결책을 찾겠다. 어쨌든 –

+0

menuInfo. 무슨 뜻이에요? –

+0

ContextMenu.ContextMenuInfo 선택한보기 정보를 보유 할 예정인 onCreateContextMenu의 menuInfo입니다. –

관련 문제