我的代码有问题,因为onChildAdded或RecyclerView我不知道是否得到它
简单我想在RecyclerView上显示收件箱,其中包含我从其他用户收到的所有邮件,每封邮件包含最后发送的邮件以及有关发件人的信息,例如他的姓名和照片。
喜欢这个
这是我的结构
Messages
Receiver_UID
Sender_UID
push
message : "text"
我使用了2个嵌套查询来实现这一点 所以首先我得到发件人UID,然后我从另一个查询中得到最后一条消息
dataQuery = FirebaseDatabase.getInstance().getReference("Messages").child(my_Id);
dataQuery.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot getalldata, String s) {
final String sender_UID = getalldata.getKey();
Query lastmess = FirebaseDatabase.getInstance().getReference("Messages").child(my_Id).child(sendUID);
lastmess.orderByKey().limitToLast(1).addChildEventListener(new ChildEventListener() { // last message
@Override
public void onChildAdded(DataSnapshot snap, String s) {
MessModel messages = snap.getValue(MessModel.class);
String Last_message = messages.getMessage();
getUserData(Last_message ,sender_UID);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
最后我通过此方法获取发件人的信息
private void getUserData(final String last_message , String sendUID) {
FirebaseDatabase.getInstance().getReference("Users").orderByKey().equalTo(sendUID).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(final DataSnapshot data, final String s) {
listImessagesitem model = data.getValue(listImessagesitem.class);
name =model.getName();
uid = model.getUid();
//another information
result.add( new listImessagesitem( name ,last_message ,uid, ... another info));
useradapter = new listMessagesAdapter(getActivity(),result);
myList.setAdapter(useradapter);
useradapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
第一次和我刷新时效果很好
问题当有人在邮件收件箱列表中向我发送新邮件时。在这种情况下,如果我没有刷新,我会看到两个发送者具有相同的信息和不同的最后消息......如果他再次发送,我会看到3个发件人具有相同的先前案例,依此类推。
我该如何解决?
我的意思是如果新邮件已经存在于我的收件箱列表
中,我该如何向用户添加新邮件任何帮助将不胜感激,谢谢
答案 0 :(得分:1)
我从你的代码中了解到的是你有嵌套的ChildEventListener。因此,每次调用顶级侦听器时,都会创建一个新的内部子侦听器,从而在调用getUserData方法时更新适配器,从而导致重复数据。
你可以做什么?
1:检查结果列表是否包含对象,否则添加否则忽略。
2:根据我的理解,我相信您正在尝试创建一个邮件客户端应用程序,其中两个用户正在相互发送电子邮件。因此,不是在数据库中使用的结构,而是为这两个用户创建单个节点,例如 user_1_ID + user_2_ID 。
这降低了复杂性,因为用户将从同一节点读取,并且消息对象应具有时间戳字段以确定最新消息。