Групповой чат Android отображает только пустой список без старых сообщений, а только новые сообщения, когда пользователь присоединяется к группе

У меня в приложении есть групповой чат. У меня есть "комнаты" и кнопка "присоединиться" к "комнате", когда пользователь нажимает кнопку "присоединиться", все старые сообщения появляются на экране, но я хочу отображать только новые, я использую адаптер списка баз FireBase для отображения... все работает нормально, но просто Не знаю, как отобразить пустой список и только новые сообщения, ты.

     btnJoin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DatabaseReference db = FirebaseDatabase.getInstance().getReference("EventsUsers").child(uniqEventID);
            db.child(user.getUid()).setValue("");


        }
    });

   btnSend.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DatabaseReference db = FirebaseDatabase.getInstance().getReference("EventsUsers").child(uniqEventID).child("Messages").push();
            db.setValue(new ChatMessage(ePlain.getText().toString(),user.getDisplayName()));
            ePlain.setText("");
            ePlain.requestFocus();

        }
    });
    private void displayChat() {
    btnSend.setVisibility(View.VISIBLE);
    eventChat.setVisibility(View.VISIBLE);
    FirebaseListAdapter<ChatMessage> adapter = new FirebaseListAdapter<ChatMessage>(EventDetails.this,ChatMessage.class,R.layout.one_chat_list,FirebaseDatabase.getInstance().getReference("EventsUsers").child(uniqEventID).child("Messages")) {
        @Override
        protected void populateView(View v, ChatMessage model, int position) {
            TextView messageTextm,messageUser,messageTime;
            messageTextm = (TextView) v.findViewById(R.id.chatMessage);
            messageUser = (TextView)v.findViewById(R.id.chatUserName);
            messageTime = (TextView)v.findViewById(R.id.message_time);

            messageTextm.setText(model.getMessageText());
            messageUser.setText(model.getMessageUser());
            messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm)", model.getMessageTime()));

        }
    };
    eventChat.setAdapter(adapter);

}
    DatabaseReference check = FirebaseDatabase.getInstance().getReference("EventsUsers").child(uniqEventID);
            check.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if(dataSnapshot.hasChild(user.getUid())){
                        displayChat();
                    }
                }

Поэтому, когда пользователь нажимает кнопку присоединиться к списку, в котором отображаются сообщения со всеми старыми сообщениями до того, как он присоединился... и извините за то, что я не загружаю какой-либо код, я новичок здесь, скажите мне, если вам нужен какой-то другой код, это моя структура базы данных https://ibb.co/d47D9v

1 ответ

Вам придется следить за временем в пожарной базе. Во-первых, вам нужно отслеживать, когда сообщения публикуются, во-вторых, вам нужно отслеживать, когда пользователь входит в комнату. Затем, когда вы запрашиваете сообщения, вы можете

sortBy('time').startAt(timeUserJoined)

РЕДАКТИРОВАТЬ на своей кнопке присоединиться

FirebaseDatabase.getInstance().getReference("EventsUsers")
    .child(uniqEventID).child(user.getUid()).setValue("");

установите значение на текущее время вместо простого добавления пустого узла в качестве флага.

Затем, когда вы добавляете сообщение, вам нужно добавить время, когда оно было добавлено. Так что просто добавьте это в класс, который вы уже сделали

db.setValue(new ChatMessage(ePlain.getText().toString(),
    user.getDisplayName()), System.currentTimeMillis());

Наконец, в вашем адаптере ваша ссылка должна быть больше похожа

FirebaseDatabase.getInstance().getReference("EventsUsers")
    .child(uniqEventID).child("Messages")
    .orderBy("time").beginAt(timeUserJoined)

timeUserJoined - значение идентификатора пользователя как ключа сверху

FirebaseDatabase.getInstance().getReference("EventsUsers").child(uniqEventID)
    .setSingleValueListener( result-> timeUserJoing = result.value)

это не идеальный код, но я думаю, вы поняли

Другие вопросы по тегам