Я пытаюсь разработать приложение для чата с двумя разными макетами для установленных и полученных сообщений. Я внедряю FireBase. Проблема в том, что этот код показывает только одну раскладку (item_self_message.xml)
. Я использую целочисленный messageType, чтобы проверить, отправлено или получено сообщение.
Вот адаптер:
public class MessageListAdapter extends RecyclerView.Adapter<MessageListAdapter.ChatViewHolder> {
private static final int VIEW_TYPE_MESSAGE_SENT = 0;
private static final int VIEW_TYPE_MESSAGE_RECEIVED = 1;
private List<ChatMessages> messageItemList;
private Context context;
int messageType;
public void setMessageType(int messageType) {
this.messageType = messageType;
}
public MessageListAdapter(Context context, List<ChatMessages> messagesList) {
this.context = context;
this.messageItemList = messagesList;
}
@NonNull
@Override
public ChatViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view;
if (messageType == 0) {
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_self_message, parent, false);
} else {
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_other_message, parent, false);
}
return new ChatViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ChatViewHolder holder, int position) {
ChatMessages chatMessages = messageItemList.get(position);
TextView timestamp = holder.txtTimestamp;
timestamp.setText(chatMessages.getTimeStamp());
TextView message = holder.txtMessage;
message.setText(chatMessages.getMessage());
}
@Override
public int getItemCount() {
return messageItemList == null ? 0 : messageItemList.size();
}
@Override
public int getItemViewType(int position) {
return position;
}
public class ChatViewHolder extends RecyclerView.ViewHolder {
TextView txtMessage, txtTimestamp;
ImageView imgMapMessage;
public ChatViewHolder(@NonNull View itemView) {
super(itemView);
txtMessage = itemView.findViewById(R.id.message);
txtTimestamp = itemView.findViewById(R.id.timestamp);
imgMapMessage = itemView.findViewById(R.id.map_message);
}
}
Вот как я устанавливаю messageType в Activity. Я использую слушатель onChildEvent два раза. Один раз для отправленных сообщений, а затем один раз для полученных сообщений. Затем я устанавливаю его в 0 или 1 в соответствии с отправленным сообщением или полученным сообщением.
mFirebaseDatabase.orderByChild("toUser").equalTo(phone).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
if (dataSnapshot.exists()){
ChatMessages chatMessagestemp = dataSnapshot.getValue(ChatMessages.class);
if( toPhone.equals(chatMessagestemp.getFromUser())){
chatAdapter.setMessageType(0);
chatMessagesArrayList.add(chatMessagestemp);
chatAdapter.notifyDataSetChanged();
}
}
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
mFirebaseDatabase.orderByChild("toUser").equalTo(toPhone).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
if (dataSnapshot.exists()){
ChatMessages chatMessagestemp = dataSnapshot.getValue(ChatMessages.class);
if(phone.equals(chatMessagestemp.getFromUser())){
chatAdapter.setMessageType(1);
chatMessagesArrayList.add(chatMessagestemp);
chatAdapter.notifyDataSetChanged();
}
}
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
Вот это JSON:
"messages" : {
"-M2IMe6W8CeV7F0O3Cv-" : {
"fromUser" : "Kshitij",
"message" : "gfdfg",
"timeStamp" : "Fri, Mar 13 2020 15:39:22",
"toUser" : "Deepak"
},
"-M2INma-C6xU82InmjDb" : {
"fromUser" : "7290870639",
"message" : "ffghh",
"timeStamp" : "Fri, Mar 13 2020 15:44:19",
"toUser" : "userMobileNumber"
},
"-M2INsHaR8je5bo_IyjD" : {
"fromUser" : "7290870639",
"message" : "hjjj",
"timeStamp" : "Fri, Mar 13 2020 15:44:41",
"toUser" : "9999888877"
},
"-M2IOlk0I6zUDd9uDsFt" : {
"fromUser" : "7290870639",
"message" : "yhuuh",
"timeStamp" : "Fri, Mar 13 2020 15:49:05",
"toUser" : "userMobileNumber"
}
}
Почему невозможно отобразить два разные взгляды?