У меня есть чат, который загружает 5 самых последних сообщений комнаты чата в порядке убывания снизу вверх до 100 * с использованием запроса Firebase.Сообщения, отправленные в коллекцию Firebase после загрузки этих сообщений, отображаются в нижней части экрана путем изменения положения, когда новые элементы списка вставляются в список после вызова onEvent.Вот мой код:
private void initRecyclerView() {
//initializes and sets adapter/resets variables
mAdapter = new ChatRecyclerViewAdapter(mMessages);
mRecyclerView.setAdapter(mAdapter);
firstEventListenerCalled = false;
final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setReverseLayout(true);
mRecyclerView.setLayoutManager(linearLayoutManager);
Query query = mCollection.orderBy("timestamp", Query.Direction.DESCENDING).limit(5;
firstRegistration = query.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
Log.d("First SnapshotListener", "Called");
for (DocumentChange documentChange : queryDocumentSnapshots.getDocumentChanges()) {
switch (documentChange.getType()) {
case ADDED:
//Creates listener for queried messages that puts messages retrieved during initial query at end of message list,
// then another one after one runs its course that puts new ones at the beginning of the list
if (!firstEventListenerCalled) {
Message message = documentChange.getDocument().toObject(Message.class);
mMessages.add(message);
mAdapter.notifyDataSetChanged();
} else if (firstEventListenerCalled) {
Message message = documentChange.getDocument().toObject(Message.class);
mMessages.add(0, message);
mAdapter.notifyDataSetChanged();
Log.d(TAG, "newMessageAdded " + message.getMessage());
}
}
}
firstEventListenerCalled = true;
}
});
Я пытаюсь удалить ListenerRegistration
в методе onStop()
действия, очистить содержимое RecyclerView
в методе onRestart()
, а затем повторновызовите указанный выше метод в onStart()
, чтобы при остановке действия не поступало никаких сообщений и чтобы любые сообщения, отправленные в течение этого времени, появлялись среди 5, запрошенных методом initRecyclerView()
при перезапуске действия:
@Override
protected void onRestart() {
super.onRestart();
mMessages.clear();
mAdapter.notifyItemRangeRemoved(0, mMessages.size());
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart Called");
initRecyclerView();
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop Called");
firstRegistration.remove();
if (refreshRegistraton != null) {
refreshRegistraton.remove();
}
}
@Override
public void onBackPressed() {
finish();
}
Однако при возобновлении активности с использованием этой стратегии происходит следующее:
- 5 запрашиваемых сообщений отображаются в правильном порядке
Любые сообщения, отправленные во времяактивность была остановлена, появляются в дополнение к этим 5 сообщениям и в обратном порядке:
Новые сообщения загружаются в порядке, описанном для firstEventListenerCalled
== true, но оно ложно в начале метода initRecyclerView()
при каждом его вызове.,Они вообще не должны загружаться отдельно, так как я удалил слушателей и полностью воссоздал RecyclerView
.Чего мне не хватает?