Я использую Firebase Firetore в своем приложении для Android-чата и упорядочиваю сообщения по метке времени, которая добавляется следующим образом при отправке нового сообщения:
Map<String, Object> messageMap = new HashMap<>();
...
messageMap.put("timestamp", FieldValue.serverTimestamp());
Вот мой код для отображения всех сообщений в чате.
Query firstQuery = FirSingleton.getInstance().mMessages.document(channelFoudId).collection("all_messages")
.orderBy("timestamp", Query.Direction.DESCENDING).limit(limit);
registration = firstQuery.addSnapshotListener(ChatActivity.this, new EventListener<QuerySnapshot>() {
@Override
public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {
if (e != null) {
Log.i(TAG, "onEvent error: " + e.getMessage());
progressbar.setVisibility(View.GONE);
isLoading = false;
} else {
if (firstTimeLoading) {
lastVisible = documentSnapshots.getDocuments().get(documentSnapshots.size() - 1);
}
for (DocumentChange documentChange : documentSnapshots.getDocumentChanges()) {
if (documentChange.getType() == DocumentChange.Type.ADDED) {
Log.i(TAG, "onEvent: new added");
if (documentChange.getDocument().exists()) {
MessageObject messageObject = documentChange.getDocument().toObject(MessageObject.class);
if (firstTimeLoading) {
//arrayList.add(messageObject);
arrayList.add(0, messageObject);
} else {
arrayList.add(messageObject);
adapter.notifyDataSetChanged();
}
}
}else {
Log.i(TAG, "onEvent: no recently added");
}
}
if (firstTimeLoading){
recyclerView.getAdapter().notifyDataSetChanged();
progressbar.setVisibility(View.GONE);
firstTimeLoading = false;
isLoading = false;
}
}
}
});
Проблема состоит в том, что когда пользователь входит в чат и появляются новые сообщения, сообщения отображаются в обратном порядке, но при обновлении данных (верните активность в чате) все сообщения располагаются в правильном порядке. Мой вопрос, как исправить это поведение.