【发布时间】:2019-04-29 09:56:08
【问题描述】:
问题:我的列表项显示顺序错误。当我关闭片段并重新打开它时会发生这种情况。然后它首先显示所有“发送的消息”,然后显示接收的消息。但是,当我在写这些消息时,它们以正确的顺序出现。只有当我关闭片段/活动并重新打开它时,顺序才会改变。
我在on-create 方法中调用getMessages 方法来打开包含视图的片段。
我的尝试:
- 使用 Firestore
orderby方法(使用字符串和时间戳) - 使用更简单的 Firestore 快照侦听器
问题:
- 如何最好地将 Firestore 快照侦听器与 RecyclerView 结合使用并正确维护项目的顺序?
这是我的主要“getMessages”方法:
public void getLiveChatMessages(final ArrayList<ChatConversationMessage> messageArrayList, final ChatConversationAdapter adapter, final String matchClicked) {
final String userID = onboardingFirebaseUser.returnCurrentUserId();
final CollectionReference messagesCollectionRef = db.collection("users")
.document(userID)
.collection("matches")
.document(matchClicked)
.collection("messages");
messagesCollectionRef
.orderBy("TimeStamp", Query.Direction.DESCENDING)
.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot value,
@Nullable FirebaseFirestoreException e) {
if (e != null) {
Log.w(TAG, "listen:error", e);
return;
}
for (QueryDocumentSnapshot doc : value) {
if (doc.get("Message") != null) {
if (doc.get("Message") != null && doc.get("From user with ID").equals(userID)) {
String message = doc.getString("Message");
messageArrayList.add(new ChatConversationMessage(message));
adapter.notifyDataSetChanged(); //Ensures messages are visible immediately
} else if (doc.get("Message") != null) {
final String message = doc.getString("Message");
DocumentReference matchRef = db.collection("users")
.document(userID)
.collection("matches")
.document(matchClicked);
matchRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
imageReference = storageReference.child(document.getString("profileImg"));
messageArrayList.add(new ChatConversationMessage(message, imageReference));
adapter.notifyDataSetChanged(); //Ensures messages are visible immediately
} else {
Log.d(TAG, "No such document");
}
} else {
Log.d(TAG, "get failed with ", task.getException());
}
}
});
}
}
}
}
});}}
【问题讨论】:
-
请添加您的数据库结构。
-
@AlexMamo 数据库结构已添加
-
请将其添加为截图。
-
@AlexMamo 添加 :-)
-
你说哪个查询不维护顺序?
标签: android firebase android-recyclerview google-cloud-firestore