Сортировка X самых последних документов Firestore Ascending по отметке времени и добавление в реальном времени - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь создать приложение чата с помощью Firestore.Мой класс сообщений имеет метку времени в виде объекта Date.Я хотел бы, чтобы активность чата загружала последние X-сообщения и добавляла новые в конец в реальном времени, используя SnapshotListener.Ниже приведено то, что у меня есть, которое сортирует самые старые сообщения X по отметке времени, но игнорирует все сообщения после и не отображает новые сообщения, когда они добавляются, если полные сообщения X уже удалены.

 final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(linearLayoutManager);


        Query query = mCollection.orderBy("timestamp",Query.Direction.ASCENDING).limit(mCurrentPage * TOTAL_ITEMS_TO_LOAD);


        query.addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
                for (DocumentChange documentChange : queryDocumentSnapshots.getDocumentChanges()) {
                    switch (documentChange.getType()) {
                        case ADDED:
                            Message message = documentChange.getDocument().toObject(Message.class);



                            mMessages.add(message);
                            mAdapter.notifyDataSetChanged();

                    }
                }
            }
        });

Редактировать: я удалил лишний код.Сортировка по убыванию приводит к тому, что сообщения при отправке запроса выводятся таким образом, при этом самые новые запрашиваемые сообщения появляются вверху, что не работает, потому что я хочу, чтобы самые новые сообщения внизу нисходили вверх:

  • queriedmessage5<-новое запрашиваемое </li>
  • запрашиваемое сообщение4
  • запрашиваемое сообщение3
  • запрашиваемое сообщение2
  • запрашиваемое сообщение1 <-стальное самое запрашиваемое </li>
  • новое сообщение1 <-добавлено после запроса * 10* </ul>

    Обращение RecyclerView с помощью setReverseLayout через менеджер раскладки исправляет порядок запрашиваемых сообщений, но затем вставляет новые сообщения в верхней части RecyclerView:

    • newmessage1 <-добавлено послеquery </li>
    • queriedmessage1 <-запрошенный запрос </li>
    • queriedmessage2
    • queriedmessage3
    • queriedmessage4
    • queriedmessage5 <-newest queried </li> 1038 *1037*

1 Ответ

0 голосов
/ 22 октября 2018

Вам нужно будет упорядочить сообщения по убыванию, чтобы получить 10 самых последних сообщений.

mCollection.orderBy("timestamp",Query.Direction.DESCENDING).limit(mCurrentPage * TOTAL_ITEMS_TO_LOAD)

Это даст вам самые последние сообщения.Когда вы добавляете сообщения, вы получаете самые новые сообщения и получаете сообщение REMOVED для сообщений, которые выпадают из запроса.

Учитывая, что вы запрашиваете сообщения в обратном хронологическом порядке,вам придется снова перевернуть клиентскую часть сообщения, чтобы отобразить их в правильном порядке в вашем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...