我想制作一个聊天应用程序,在其中可以加载聊天的所有消息。它们已经在我的Firestore中,但是当我初始化代码时,我的消息集合的SnapshotListener会在初始化后立即触发,告诉我已添加到Firestore中的所有项目。我想拥有所有这些物品,但问题是它们都是随机排列的。因此,我的目标是在初始化时填充消息,然后仅在将新消息添加到Firestore时由侦听器通知。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//... more code here
messagesCollectionReference.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@javax.annotation.Nullable QuerySnapshot queryDocumentSnapshots, @javax.annotation.Nullable FirebaseFirestoreException e) {
if (e != null) {
System.out.println("Error:" + e);
return;
}
for (DocumentChange dc : queryDocumentSnapshots.getDocumentChanges()) {
ChatMessage myChatMessage = dc.getDocument().toObject(ChatMessage.class);
mMessageAdapter.add(myChatMessage);
}
}
});
//... more code here
}
这是我的代码当前的样子,并以随机顺序加载所有消息,我想要的就是这样。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//... more code here
messagesCollectionReference.orderBy("timestamp").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
ChatMessage myChatMessage = document.toObject(ChatMessage.class);
mMessageAdapter.add(myChatMessage);
}
} else {
System.out.println("Error: " + task.getException());
}
}
});
messagesCollectionReference.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@javax.annotation.Nullable QuerySnapshot queryDocumentSnapshots, @javax.annotation.Nullable FirebaseFirestoreException e) {
if (e != null) {
System.out.println("Error:" + e);
return;
}
for (DocumentChange dc : queryDocumentSnapshots.getDocumentChanges()) {
ChatMessage myChatMessage = dc.getDocument().toObject(ChatMessage.class);
mMessageAdapter.add(myChatMessage);
}
}
});
//... more code here
}
但是,如果现在执行此操作,则我将首先按错误的顺序显示消息,然后按正确的顺序显示消息。因此,我需要一种方法来防止快照侦听器在初始化时已被释放到Firestire中的数据触发。