Через некоторое время я обнаружил проблему.
Я вызывал метод get для новой ссылки в слушателе снимка.Когда вы делаете это, это влияет на порядок элементов в вашем ArrayList.
Чтобы решить эту проблему, убедитесь, что все элементы, необходимые вам из Firestore для создания ArrayList, хранятся в том же месте, что и поля в каждом документе (а не в двух разных местах).Таким образом, вам не нужно использовать отдельный метод get для новой ссылки в слушателе снимка.Это также обеспечивает чистоту кода на стороне клиента.Для будущих пользователей Google вот как я реструктурировал свой метод:
messagesCollectionRef
.orderBy("TimeStamp", Query.Direction.ASCENDING)
.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot snapshots,
@Nullable FirebaseFirestoreException e) {
if (e != null) {
Log.w(TAG, "listen:error", e);
return;
}
for (DocumentChange dc : snapshots.getDocumentChanges()) {
switch (dc.getType()) {
case ADDED:
Log.d(TAG, "New message added" + dc.getDocument().getData());
if (dc.getDocument().get("Message") != null && dc.getDocument().get("From user with ID").equals(userID)) {
String message = dc.getDocument().getString("Message");
messageArrayList.add(new ChatConversationMessage(CURRENTUSER, message, null));
adapter.notifyDataSetChanged();
}
if (dc.getDocument().get("Message") != null && dc.getDocument().get("From user with ID").equals(matchClicked)) {
String message = dc.getDocument().getString("Message");
imageReference = storageReference.child(dc.getDocument().getString("profileImg"));
messageArrayList.add(new ChatConversationMessage(OTHERUSER, message, imageReference));
adapter.notifyDataSetChanged();
}
break;
case MODIFIED:
break;
case REMOVED:
break;
}
}
}
});
Как вы можете видеть, я теперь сохранил строку imageReference в каждом документе сообщения в Firestore, и его можно получить таким же образомЯ извлекаю все другие данные, которые мне нужны, чтобы добавить в мой ArrayList.Главное изменение кода, которое вам нужно сделать, - это то, где вы записываете свои данные в облако (т.е. пишете / устанавливаете документы Firestore).Вот где вам нужно убедиться, что все добавлено в документ в качестве значений полей, поэтому вам не нужно получать его в разных местах.Удачи!