gpt4 book ai didi

android - 使用 firebase 按最近的消息对聊天列表进行排序

转载 作者:行者123 更新时间:2023-12-05 00:07:53 25 4
gpt4 key购买 nike

我不知道为什么我遇到了 chatList 没有按最后一条消息时间或最新消息排序的问题。我已尝试将 timestamporderChildBy 时间戳存储在数据库中,但它仍然无法正常工作。不工作意味着列表不会在每条消息后排序,并继续显示列表为在第一条消息后排序。

看图,乱七八糟的!

enter image description here

这是我在 ChatActiviy 中的 firebaseDatabase 中的 sendMessage 中创建 chatList 的方式:

    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 中检索聊天列表时,我试图获取每个用户的用户详细信息,这些用户在数据库中显示为 currentUser 的子级。 (聊天列表>>CurrentUserId)

已编辑

  private fun retrieveChatList() {

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

override fun onDataChange(snapshot: DataSnapshot)
{
(usersChatList as ArrayList<String>).clear()
if (snapshot.exists()){
for (dataSnapshot in snapshot.children){
val userUid = dataSnapshot.key
if (userUid != null) {
(usersChatList as ArrayList<String>).add(userUid)
}
}
readChatList()
}
}
})
}

private fun readChatList() {
mUsers = ArrayList()
val userRef = FirebaseFirestore.getInstance().collection("Users")
userRef.get()
.addOnSuccessListener { queryDocumentSnapshots ->
mUsers?.clear()
for (documentSnapshot in queryDocumentSnapshots) {
val user = documentSnapshot.toObject(User::class.java)
for (id in usersChatList!!){
if (user.getUid() == id){
(mUsers as ArrayList<User>).add(user)
}
}
}
retrieveGroupChatList()
chatListAdapter?.notifyDataSetChanged()
chatListAdapter = context?.let { ChatListAdapter(it, (mUsers as ArrayList<User>), true) }
recyclerViewChatList.adapter = chatListAdapter

}.addOnFailureListener { e ->
Log.d(ContentValues.TAG, "UserAdapter-retrieveUsers: ", e)
}

}

这是好友信息的 chatListAdapter

private fun friendInfo(fullName: TextView, profileImage: CircleImageView, uid: String) {
val userRef = FirebaseFirestore.getInstance().collection("Users").document(uid)
userRef.get()
.addOnSuccessListener {
if (it != null && it.exists()) {
val user = it.toObject(User::class.java)
Picasso.get().load(user?.getImage()).placeholder(R.drawable.default_pro_pic).into(profileImage)
fullName.text = user?.getFullName()
}
}
}

这是实时数据库的图片,有一个模型类为 ChatList,每次我发送或接收消息时,时间戳都会得到更新。

ChatList

还有另一张 Users 在 firestore 中的图片,模型类为 Users .

解决方案

我有一个可行的解决方案,我在 Firestore 用户集合中创建或更新一个字段作为 lastMessageTimestamp,这样用户现在可以按 lastMessageTimestamp 排序 .

   val timeAgo = Date().time

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

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

//firebase chatlist references.
val chatListSenderReference = dbRef.child("ChatList").child(currentUserID).child(friendId)
val chatListReceiverReference = dbRef.child("ChatList").child(friendId).child(currentUserID)

//Firestore Users references.
val chatListSenderRef = fStore.collection("Users").document(currentUserID)
val chatListReceiverRef = fStore.collection("Users").document(friendId)

chatListSenderReference.addListenerForSingleValueEvent(object : ValueEventListener{
override fun onDataChange(p0: DataSnapshot) {
if(!p0.exists()){
chatListSenderReference.setValue(friendId)
//update the timestamp in Users collection
chatListSenderRef.update(myFSMap)
}
chatListReceiverReference.setValue(currentUserID)
chatListReceiverRef.update(friendFSMap)

override fun onCancelled(p0: DatabaseError) {
}
}
})

并且在阅读时,我对用户使用orderBy

 val userRef = FirebaseFirestore.getInstance().collection("Users").orderBy("lastMessageTimestamp" , Query.Direction.ASCENDING)

但这不是完整的解决方案,因为我似乎每次在消息传递时读取和写入 lastMessageTimestamp,这会增加 Firebase Billing 金额到巨大的可怕数字。所以我仍然需要一个解决方案。

最佳答案

简单的技巧是按消息的 id 排序。因为 firebase 基于实时 + 一些因素生成的 id。因此,让我们尝试按 Id 而不是您的时间戳进行排序。 (注意:只是由 firebase 生成的 id)

关于android - 使用 firebase 按最近的消息对聊天列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64968904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com