为了账号安全,请及时绑定邮箱和手机立即绑定

在显示 Firebase 查询的 RecyclerView 开头插入对象

在显示 Firebase 查询的 RecyclerView 开头插入对象

HUX布斯 2021-10-28 09:24:57
我正在使用 Firebase 进行聊天活动来存储消息并RecyclerView显示它们。根据下面的适配器构造RecyclerView函数,初始化时,从 Cloud Firestore 查询最后 50 条消息,并按 Unix 时间戳按降序排列。然后我在我的聊天活动中使用 setStackFromEnd(true) 来翻转它们的显示顺序,因为最新的消息应该在底部附近,并且使用 messageList.add(0,message) 将新消息添加到适配器的消息列表中这提出了一个问题。在 onBindViewHolder 中,以前可以接受的:Message message = messageList.get(position);holder.message.setText(message.getMessage());holder.author.setText(message.getAuthor() + ":");不再有效,因为当 RecyclerView 加载时,进入 RecyclerView 的消息将是最新消息的重复(位置 0 中的消息)。IE:留言一留言一留言一留言一代替:留言一留言二留言三讯息四其中“消息一”RecyclerView是创建时的最新消息。将其替换为:Message message = messageList.get(0);holder.message.setText(message.getMessage());holder.author.setText(message.getAuthor() + ":");在onBindViewHolder得到真正的最新消息将让它出现在屏幕上,但也随之更换最新消息的所有项目时,则可将其回收。最终,我希望按照新近的顺序从下到上查询消息,同时继续将最新消息放在底部(就像有史以来的每个聊天应用程序一样),而不必查询整个集合。我应该在哪里纠正我的错误以及如何纠正?适配器构造函数:public ChatRecyclerViewAdapter(Context mContext, ArrayList<String> mMessage, ArrayList<String> mAuthor, String mRoomID, FirebaseFirestore firestore) {        messageList = new ArrayList<>();        firestore = FirebaseFirestore.getInstance();        mCollection = firestore.collection(mRoomID + "_messages");        Query query = mCollection.orderBy("timestamp", Query.Direction.DESCENDING).limit(50);        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:                            documentChange.getDocument();                            Message message = documentChange.getDocument().toObject(Message.class);                            messageList.add(0,message);                            notifyItemInserted(messageList.size());                    }                }            }        });
查看完整描述

1 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

您的代码中的问题是您使用 aUnix timestamp而不是使用Date对象按降序排序。为了使其工作,我建议您更改将时间戳存储为日期的方式。为此,请参阅我在这篇文章中的回答,我已经解释了如何使用 aPOJO class或使用 a来实现这一点Map

在这里,您可以找到有关如何创建聊天应用程序的教程,我在其中解释了您正在寻找的完全相同的内容。请看下面的截图:

//img1.sycdn.imooc.com//6179fc2b0001fae209160634.jpg

在我用作查询的代码中,以下代码行:


val query = rootRef!!

    .collection("messages")

    .document(roomId)

    .collection("roomMessages")

    .orderBy("sentAt", Query.Direction.ASCENDING)


查看完整回答
反对 回复 2021-10-28
  • 1 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信