我正在使用Firebase回收适配器来显示我的消息。我想在回收视图顶部显示新收到的消息。 例如,Jfi ..的新发送/接收的邮件应放在顶部。
这是我的数据库结构。
代码:
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();
谢谢
答案 0 :(得分:2)
您可以使用时间戳将消息存储到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");