我正在尝试使用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();
}
}
}
});
编辑:我已经删除了多余的代码。按降序排序会导致在查询时这样排列邮件,将查询的最新消息显示在顶部,这是行不通的,因为我想让最新的消息在底部向下递增:
通过布局管理器使用setReverseLayout反转RecyclerView可以更正查询消息的顺序,但随后在RecyclerView的顶部插入新消息:
答案 0 :(得分:1)
您需要对降序排列的消息进行排序,以获取最新的10条消息。
mCollection.orderBy("timestamp",Query.Direction.DESCENDING).limit(mCurrentPage * TOTAL_ITEMS_TO_LOAD)
这将为您提供最新的物品。添加邮件时,您将获得最新的邮件,并且会为查询之外的邮件获得REMOVED
事件。
鉴于您以倒序的顺序请求消息,则必须再次反转消息客户端,以在应用程序中以正确的顺序显示它们。