Firebase UI:如何将新消息添加到 recycleView 的顶部

Firebase UI: How to add new message to the top of recycleView

我正在使用 Firebase 回收适配器来显示我的消息。我想在回收视图的顶部显示新收到的消息。 例如,Jfi 的新 sent/received 消息.. 应该在最上面。

这是我的数据库结构。

代码:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    Query query = rootRef.child("messages").child(messageSenderId).child(messageReceiverId);


    FirebaseRecyclerOptions<ChatMessage> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<ChatMessage>()
            .setQuery(query, ChatMessage.class)
            .build();

谢谢

你可以将带有时间戳的消息存储到 Firebase 中,然后当你检索消息的所有数据时,将其与其余消息进行比较并按日期排序,它们将显示在顶部最新消息,或者只是反转 RecyclerView,您将在 RecyclerView

顶部看到最新消息
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setReverseLayout(true);
linearLayoutManager.setStackFromEnd(true);
myRecyclerView.setLayoutManager(linearLayoutManager);

编辑

您可以比较每条消息的值并按从 Firebase 获得的时间戳对它们进行排序

 public class timeStampSort implements Comparator<YourModel> {

        @Override
        public int compare(YourModel o1, YourModel o2) {
            return Long.compare(o2.getTimestamp(), o1.getTimestamp());

        }

    }

然后在调用 mAdapter = new MessagesAdapter.... 之前执行此操作

Collections.sort(yourArray, new timeStampSort());

这应该用每封邮件的时间戳对您的邮件进行排序,而不必颠倒 RecyclerView

如果您已经在查询中创建了另一个 orderByChild,并且您只能执行一次,则可以执行上述排序。

但是,正如 Frank 所建议的那样,使用 orderByChild 会更有效率,所以你只能这样做

Query query = rootRef.child("messages").child(messageSenderId).child(messageReceiverId).orderByChild("timestamp");