首页 > 解决方案 > 基于 MessageList 排序用户列表 - Kotlin & Android

问题描述

我正在尝试按用户 ID 在 MessageList 数组中出现的顺序对用户对象列表进行排序。MessageList 包含用户正在与之聊天的人的 ID(按时间排序 - 使用 sortwith),然后按照与消息列表相同的顺序将其作为用户列表发送到用户适配器。这样可以显示用户名、个人资料图片和其他详细信息……我从 firebase 了解到用户的数据快照按原样提供,因此需要再次订购……

我试图根据 MessageList 对用户数组列表进行排序,但它在 id 访问方面存在问题(要求我将其公开)并且最终输出不再是用户列表。您将如何继续展示按时间戳排序的 MessageList?

用户数据类

class Users {
private var uid: String = ""}

消息列表数据类

class MessageList {
private var id: String = ""
private var chattimeStmp: Long = 0}

基于 MessagesList 创建用户列表的函数

private var userMsgAdapter: UserMsgAdapter? = null
private var mUsers: List<Users>? = null
private var usersMsgList: List<MessageList>? = null
private var firebaseUser : FirebaseUser? = null
lateinit var recycler_view_msgList : RecyclerView

private fun retrieveMessageList()
    {
        mUsers = ArrayList()
        val ref = FirebaseDatabase.getInstance().reference.child("Users")
        ref.addValueEventListener(object : ValueEventListener {

            override fun onDataChange(p0: DataSnapshot) {
                (mUsers as ArrayList).clear()

                //sorting MessageList based on timestamp
                usersMsgList?.sortedBy { it.getChattimeStmp() }

                for (dataSnapshot in p0.children) {
                    val user = dataSnapshot.getValue(Users::class.java)
                    for (eachMessageList in usersMsgList!!) {
                        if (eachMessageList.getId()
                                .equals(user!!.getUID()) && !firebaseUser?.uid.equals(
                                eachMessageList.getId()
                            )
                        ) {
                            (mUsers as ArrayList).add(user)
                        }
                    }
                }

                //Creating a map and sorting list based on the other
                val orderById = usersMsgList!!.withIndex().associate { it.value to it.index }
                val mSortedUsers = (mUsers as ArrayList<Users>).sortedBy { orderById[it.getUID()] }

                userMsgAdapter = UserMsgAdapter(context!!, mUsers as ArrayList<Users>, true)
                userMsgAdapter!!.notifyDataSetChanged()
                recycler_view_msgList.adapter = userMsgAdapter
            }

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

标签: androidsortingkotlinfirebase-realtime-database

解决方案


在这种情况下,最好的解决方案是不根据用户对象在消息列表中出现的顺序对用户对象进行排序,而是直接为消息列表中的每个对象调用回收器视图,并在适配器中获取用户详细信息。


推荐阅读