我不知道为什么我会陷入这样一个问题:聊天列表没有按最后一条消息的时间或最近一条消息排序。我试过储存 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
}
})
这是数据库的图片,每次我发送或接收消息时,时间戳都会得到更新。
3条答案
按热度按时间rbpvctlc1#
您需要在当前用户id之后指定另一个子级,因为每个用户id中都有一个id列表。
cig3rfwq2#
如果你想得到准确的结果,那么你就必须改变你的类型
timestamp
从字符串到数字的字段。您需要进行此更改是因为字符串值的顺序是按字典顺序排列的。所以你应该在数据库和你的课堂上改变这个。irlmq6kh3#
执行以下更改:
按键获取订单
如果您以后需要消息的时间(即在聊天消息中显示),则在将更改推送到firebase之前,请将时间存储在聊天消息模型中。
更新你的json结构,更新你的聊天信息模型如下,