java聊天列表未按firebase的最新消息排序

67up9zun  于 2021-07-11  发布在  Java
关注(0)|答案(3)|浏览(267)

我不知道为什么我会陷入这样一个问题:聊天列表没有按最后一条消息的时间或最近一条消息排序。我试过储存 timestamp 在数据库和orderchildby时间戳中,但它仍然不工作。
这是我在 firebaseDatabase :

val timeAgo = Date().time

    val myTimeMap = HashMap<String, Any?>()
        myTimeMap["timestamp"] = timeAgo
        myTimeMap["id"] = friendId

    val friendTimeMap = HashMap<String, Any?>()
        friendTimeMap["timestamp"] = timeAgo
        friendTimeMap["id"] = currentUserID

    val chatListSenderReference = dbRef.child("ChatList").child(currentUserID).child(friendId)
        chatListSenderReference.keepSynced(true)
        chatListSenderReference.addListenerForSingleValueEvent(object : ValueEventListener{
              override fun onCancelled(p0: DatabaseError) {
              }
              override fun onDataChange(p0: DataSnapshot) {
                       if(!p0.exists()){
                             chatListSenderReference.updateChildren(friendTimeMap)
                       }
    val chatListReceiverReference = dbRef.child("ChatList").child(friendId).child(currentUserID)
        chatListReceiverReference.updateChildren(myTimeMap)
        }
    })

在recyclerview中检索聊天列表

mUsers = ArrayList()
        val userRef = dbRef.child("ChatList").child(currentUserID).orderByChild("timestamp")
        userRef.addValueEventListener(object : ValueEventListener
        {
            override fun onCancelled(error: DatabaseError) {
            }

            override fun onDataChange(snapshot: DataSnapshot)
            {
                (mUsers as ArrayList).clear()
                snapshot.children.forEach {
                    val userUid = it.key
                    if (userUid != null) {
                        (mUsers as ArrayList).add(User(uid = userUid))
                    }
                }
                retrieveGroupChatList()
                chatListAdapter?.notifyDataSetChanged()
                chatListAdapter = context?.let { ChatListAdapter(it, (mUsers as ArrayList<User>), true) }
                recyclerViewChatList.adapter = chatListAdapter
            }
        })

这是数据库的图片,每次我发送或接收消息时,时间戳都会得到更新。

rbpvctlc

rbpvctlc1#

您需要在当前用户id之后指定另一个子级,因为每个用户id中都有一个id列表。

cig3rfwq

cig3rfwq2#

如果你想得到准确的结果,那么你就必须改变你的类型 timestamp 从字符串到数字的字段。您需要进行此更改是因为字符串值的顺序是按字典顺序排列的。所以你应该在数据库和你的课堂上改变这个。

irlmq6kh

irlmq6kh3#

执行以下更改:
按键获取订单
如果您以后需要消息的时间(即在聊天消息中显示),则在将更改推送到firebase之前,请将时间存储在聊天消息模型中。
更新你的json结构,更新你的聊天信息模型如下,

ChatMessage(Your message model class)
  -uid  (id of the user that sent the message)
  -name (name of the person that sent the chat message)
  -message
  -timestamp (time when user sent the message)

相关问题