java - 我的适配器不会更新值,直到我返回然后再次返回该活动。什么原因
问题描述
我希望当用户看到消息时,它应该将文本从传递到看到。但这仅在我返回并再次参加该聊天活动时才会发生。我唯一的问题是当两个用户聊天都打开时如何将“已交付”更新为“已看到”。除此问题外,所有其他工作都很好。可能是适配器未通知。这是我看到消息的聊天活动代码:
private void seenMessage(){
messageRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (final DataSnapshot snapshot:dataSnapshot.getChildren()){
rootRef.child("Messages").child(friendUserId).child(currentUID).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot1) {
for (DataSnapshot snapshot1:dataSnapshot1.getChildren()){
ChatMessage chatMessage=snapshot1.getValue(ChatMessage.class);
if (chatMessage.getFrom().equals(friendUserId)){
HashMap seen=new HashMap();
seen.put("isseen",true);
snapshot.getRef().updateChildren(seen);
snapshot1.getRef().updateChildren(seen);
chatMessageAdapter.notifyDataSetChanged();
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
chatMessageAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
我的适配器代码在这里
if (userMessageList.size()-1==i){
if (message.isIsseen()){
chatMessageViewHolder.seenStatus.setText("Seen");
}
else {
chatMessageViewHolder.seenStatus.setText("Delivered");
}
}
else {
chatMessageViewHolder.seenStatus.setVisibility(View.GONE);
}
解决方案
替换addListenerForSingleValueEvent
为addValueEventListener
at your messageRef
,因为第一个侦听器只触发一次以在该引用处侦听您的值,它只会通知您的适配器一次,相反,如果该引用有任何更改,第二个侦听器会继续侦听,您将在不离开活动的情况下实时查看更改,因为每当在该引用处进行更改时都会通知适配器。
推荐阅读
- powershell - 调用命令到 DC -msexchhidefromaddresslists
- flask - 如何使用 moto 和 pytest 为烧瓶 REST API 编写单元测试代码?
- workspace - XFCE 工作空间边距在多屏幕设置上不一致
- android - 如何在颤动中存储密钥对?
- c# - 路由声明它在 system.web 中定义,但未找到错误
- r - 如何为 RMarkdown 文档的不同部分设置字体样式和大小?
- powershell - 在文件繁忙或其他错误的情况下,如何在没有交互式对话框的情况下将文件移动到 powershell 中的 RECYCLE.BIN?
- gitlab - 如何从 centos 中完全删除/卸载 gitlab-runner
- sql - 如何从 SQL 条件查询中删除冗余代码
- python - 如何使用不同的标记分隔符连接多个 Pandas DataFrame 列?