Как показать, является ли сообщение видимым или нет с помощью базы данных реального времени Firebase - PullRequest
2 голосов
/ 28 апреля 2020

Я хочу показать, замечено ли сообщение в моем приложении, которое использует базу данных реального времени Firebase. Что я могу до сих пор, так это обновить его в базе данных, если сообщение увидено или нет, но я нет возможность получить это значение с помощью прослушивателей в моем адаптере повторного просмотра. Бывает, что если последнее сообщение не видно, оно отображает, что все предыдущие сообщения не отображаются аналогично, если последнее сообщение отображается, оно отображает все предыдущие сообщения.

Структура базы данных enter image description here

Мой код для проверки, является ли сообщение видимым или нет

     @Override
    public void onBindViewHolder(@NonNull MessageAdapter.ViewHolder holder, int position) {

        Chat chat=mChat.get(position);
        holder.show_message.setText(chat.getMessage());

        if (Key != null) {

            DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Chats").child(ChatKey).child(Key);

            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    Chat chat1 = dataSnapshot.getValue(Chat.class);
                    if (chat1.isIsseen()) {

                        holder.Delivered.setImageResource(R.drawable.ic_done_all_black_24dp);
                    } else {
                        holder.Delivered.setImageResource(R.drawable.ic_check_black_24dp);
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            };
            databaseReference.addValueEventListener(eventListener);

        }

        if (imageurl.equals("default")){
            holder.profile_image.setImageResource(R.drawable.user2);
        } else {
            Glide.with(mContext).load(imageurl).into(holder.profile_image);
        }
}

Обновление

Класс чата

    public class Chat {
    private String sender;
    private String receiver;
    private  String message;
    private boolean isseen;
    private long timestamp;
    String MessageId;

    public Chat(String sender, String receiver, String message, boolean isseen, long timestamp) {
        this.sender = sender;
        this.receiver = receiver;
        this.message = message;
        this.isseen = isseen;
        this.timestamp = timestamp;
    }

    public Chat() {
    }

    public String getSender() {
        return sender;
    }

    public void setSender(String sender) {
        this.sender = sender;
    }

    public String getReceiver() {
        return receiver;
    }

    public void setReceiver(String receiver) {
        this.receiver = receiver;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getMessageId() {
        return MessageId;
    }

    public void setMessageId(String messageId) {
        MessageId = messageId;
    }

    public boolean isIsseen() {
        return isseen;
    }

    public void setIsseen(boolean isseen) {
        this.isseen = isseen;
    }

    public long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(long timestamp) {
        this.timestamp = timestamp;
    }
}

Update2

isseen Listener

private void seenMessage(final String userid){
    reference = FirebaseDatabase.getInstance().getReference("Chats").child(ChatKey);
    // reference.keepSynced(true);
    seenListener=new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if(dataSnapshot.exists()) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    Chat chat = snapshot.getValue(Chat.class);
                    if (chat.getReceiver().equals(fuser.getUid()) && chat.getSender().equals(userid)) {

                        HashMap<String, Object> hashMap = new HashMap<>();
                        hashMap.put("isseen", true);
                        snapshot.getRef().updateChildren(hashMap);
                    }
                }
            }

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    };
    reference.addListenerForSingleValueEvent(seenListener);

}

1 Ответ

1 голос
/ 28 апреля 2020

Сделайте это в onBindViewHolder

 @Override
public void onBindViewHolder(@NonNull MessageAdapter.ViewHolder holder, int position) {

    Chat chat=mChat.get(position);
    holder.show_message.setText(chat.getMessage());

    boolean isSeen = chat.isIsseen();

    if(isSeen){
    //seen                  
    holder.Delivered.setImageResource(R.drawable.ic_done_all_black_24dp);

    }else{
    //not seen                
    holder.Delivered.setImageResource(R.drawable.ic_check_black_24dp);


    }


    if (imageurl.equals("default")){
        holder.profile_image.setImageResource(R.drawable.user2);
    } else {
        Glide.with(mContext).load(imageurl).into(holder.profile_image);
    }

   }

ОБНОВЛЕНИЕ:

Если вы хотите обновить sh в режиме рециркуляции для обновлений в режиме реального времени добавьте этот метод в поле onBindViewHolder():

@Override
public void onDataChanged() {
//refresh
 yourAdapter.notifyDataSetChanged();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...