How to show if a message is seen or not via using Firebase Real time Database

六眼飞鱼酱① 提交于 2020-05-15 09:30:10

问题


I want to show if a message is seen or not in my app which is using Firebase Real time Database.What i am able to till now is update it on on the database if the message is seen or not but i am not able to retrieve that value using listeners in my recyclerview Adaptor .It happens that if the last message is not seen it displays all the previous messages are not seen similarly if the last message is seen it displays all the previous messages are seen.

Database Structure

My Code for checking if the message is seen or not

     @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);
        }
}

Update

Chat Class

    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:


Do this in 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);
    }

   }

UPDATE:

If you want to refresh the recycler view for live updates add this method under the onBindViewHolder():

@Override
public void onDataChanged() {
//refresh
 yourAdapter.notifyDataSetChanged();
}


来源:https://stackoverflow.com/questions/61483623/how-to-show-if-a-message-is-seen-or-not-via-using-firebase-real-time-database

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!