-1

Dans mon application Android firebase chat, je veux utiliser recyclerview pour afficher chatlist selon le type de message-à-dire soit entrant ou sortantrecyclerview avec deux viewtypes pas chaning viewType

Permettez-moi d'abord vous dire la structure de données firebase

<ConversationId> 
    <MsgId> 
     text :"Hello" 
     timestamp :<timestamp> 
     sender :<sender's uid> 
     receiver :<receiver's uid> 

Ce qui suit est ma classe adaptateur

public class MultiViewTypeAdapter extends RecyclerView.Adapter { 

     private List<SingleChatList> chatList; 
     int total_types; 


     public class incoming extends RecyclerView.ViewHolder 
     { 
      public TextView message,time; 
      //public CircleImageView dp; 

      public incoming(View view) 
      { 
       super(view); 
       message=(TextView)view.findViewById(R.id.message_text); 
       time=(TextView)view.findViewById(R.id.timestamp_text); 
      } 
     } 

     public class outgoing extends RecyclerView.ViewHolder 
     { 
      public TextView message,time; 
      //public CircleImageView dp; 

      public outgoing(View view) 
      { 
       super(view); 
       message=(TextView)view.findViewById(R.id.message_text_view); 
       time=(TextView)view.findViewById(R.id.timestamp_text_view); 
      } 
     } 



     public MultiViewTypeAdapter(List<SingleChatList> data) { 
      this.chatList = data; 
      total_types = chatList.size(); 
     } 

     @Override 
     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

      View view; 
      switch (viewType) { 
       case 0: 
        view = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_incoming_bubble, parent, false); 
        return new incoming(view); 
       case 1: 
        view = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_outgoing_bubble, parent, false); 
        return new outgoing(view); 

      } 
      return null; 
     } 
     @Override 
     public int getItemViewType(int position) { 

      int swi=0; 
      if(chatList.get(position).getSender()== FirebaseAuth.getCurrentUser().getUid()) 
      { 
       swi=1; 
      } 
      else 
      { 
       swi=0; 
      } 
      return swi; 


     } 
     @Override 
     public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int listPosition) { 

      SingleChatList chat=chatList.get(listPosition); 

      if (chat != null) { 
       int swi=0; 
       if(chat.getSender()== FirebaseAuth.getCurrentUser().getUid()) 
       { 
        swi=1; 
       } 
       else 
       { 
        swi=0; 
       } 
       switch (swi) { 
        case 0: 
         ((incoming) holder).message.setText(chat.getMsg()); 
         ((incoming) holder).time.setText(String.valueOf(chat.getTimestamp())); 

         break; 
        case 1: 
         ((outgoing) holder).message.setText(chat.getMsg()); 
         ((incoming) holder).time.setText(String.valueOf(chat.getTimestamp())); 
         break; 

       } 
      } 
     } 


     @Override 
     public int getItemCount() { 
      return chatList.size(); 
     } 
    } 

ici, je décidais viewType en utilisant la logique suivante

senderuid== FirebaseAuth.getCurrentUser().getUid(); 

Si la condition ci-dessus est vraie, il doit s'agir d'un message sortant.

Je cours au-dessus de code, mais rien ne change pour tous les messages que la mise en page msg entrant applique en

+0

La fonction onBindViewHolder utilise holder.getItemViewType() pour obtenir viewtype – Nidhin

Répondre

0

Dans votre code, vous utilisez return pour chaque cas. Affecter une valeur à une variable locale et la renvoyer à la fin est considéré comme une bonne pratique. Les méthodes ayant plusieurs exits sont plus difficiles à déboguer et peuvent être difficiles à lire. Vous retenez également null en tant que viewholder à la fin. Essayez ce code mis à jour et vérifiez que cela fonctionne.

public class MultiViewTypeAdapter extends RecyclerView.Adapter { 

private List<SingleChatList> chatList; 
int total_types; 

public class incoming extends RecyclerView.ViewHolder { 
    public TextView message, time; 

    //public CircleImageView dp; 
    public incoming(View view) { 
     super(view); 
     message = (TextView) view.findViewById(R.id.message_text); 
     time = (TextView) view.findViewById(R.id.timestamp_text); 
    } 
} 

public class outgoing extends RecyclerView.ViewHolder { 
    public TextView message, time; 
    //public CircleImageView dp; 

    public outgoing(View view) { 
     super(view); 
     message = (TextView) view.findViewById(R.id.message_text_view); 
     time = (TextView) view.findViewById(R.id.timestamp_text_view); 
    } 
} 

public MultiViewTypeAdapter(List<SingleChatList> data) { 
    this.chatList = data; 
    total_types = chatList.size(); 
} 


@Override 
public int getItemViewType(int position) { 
    int swi = 0; 
    if (chatList.get(position).getSender() == FirebaseAuth.getCurrentUser().getUid()) { 
     swi = 1; 
    } else { 
     swi = 0; 
    } 
    return swi; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    RecyclerView.ViewHolder holder = null; 
    View view; 
    switch (viewType) { 
     case 0: 
      view = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_incoming_bubble, parent, false); 
      holder = new incoming(view); 
      break; 
     case 1: 
      view = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_outgoing_bubble, parent, false); 
      holder = new outgoing(view); 
      break; 
    } 
    return holder; 
} 

@Override 
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int listPosition) { 

    SingleChatList chat = chatList.get(listPosition); 
    switch (holder.getItemViewType()) { 
     case 0: 
      if (chat != null) { 
       ((incoming) holder).message.setText(chat.getMsg()); 
       ((incoming) holder).time.setText(String.valueOf(chat.getTimestamp())); 
      } 
      break; 
     case 1: 
      if (chat != null) { 
       ((outgoing) holder).message.setText(chat.getMsg()); 
       ((incoming) holder).time.setText(String.valueOf(chat.getTimestamp())); 
      } 
      break; 
    } 
} 

@Override 
public int getItemCount() { 
    return chatList.size(); 
} 
} 
0

Vous devez utiliser viewHolder.getItemViewType() l'intérieur onBindViewHolder

essayer ci-dessous le code

@Override 
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int listPosition) { 

    SingleChatList chat=chatList.get(listPosition); 
    switch (holder.getItemViewType()) { 
     case 0: 
      incoming incommindHolder= (incoming) holder; 
      //TODO Bind data view Holder 
      incommindHolder.message.setText(chat.getMsg()); 
      incommindHolder.time.setText(String.valueOf(chat.getTimestamp())); 
      break; 

     case 1: 
      outgoing outGoindHolder= (outgoing) holder; 
      //TODO Bind data view Holder 
      outGoindHolder.message.setText(chat.getMsg()); 
      outGoindHolder.time.setText(String.valueOf(chat.getTimestamp())); 
      break; 
    } 
} 

Note: S'il vous plaît en savoir plus sur java nommage convention mate :)