Несколько типов представлений в Android Recyclerview, отображающих только одно представление - PullRequest
1 голос
/ 15 марта 2020

Я пытаюсь разработать приложение для чата с двумя разными макетами для установленных и полученных сообщений. Я внедряю 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"
    }
}

Почему невозможно отобразить два разные взгляды?

1 Ответ

2 голосов
/ 15 марта 2020

Поскольку вы возвращаете только один тип из

@Override
public int getItemViewType(int position) {

    return position;

}

Измените его на

@Override
public int getItemViewType(int position) {
    if(messageItemList.get(position).messageType==0)
      return <whichever_type_you_want>;
    else
      return <whichever_type_you_want>;

}

Кроме того, поместите messageType внутри объекта ChatMessages, чтобы можно было сопоставить тип с каждым держателем представления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...