首页 > 解决方案 > 以预定义的顺序获取用户 ID(Firebase 和 Kotlin)

问题描述

更新的问题

我有一个有序的聊天列表 (userMsglist),但由于我需要显示与每个聊天相关的用户配置文件图像和名称,我必须基于 FB 实时数据库中的用户节点创建一个 mUsers 列表。在这一点上,我松开了当前的订单。如何根据 userMsgList 中的顺序创建 mUsers 列表

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()
          //  usersMsgList?.sortedBy { it.getChattimeStmp() }
            //Sorting of chatlist
            Collections.sort(usersMsgList!!, this@Messages::compare)
            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)
                    }
                }
            }

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

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



private fun compare(o1: MessageList, o2: MessageList): Int {

    return if (o1.getChattimeStmp()!! < o2.getChattimeStmp()!!) 1 else if (o1.getChattimeStmp() == o2.getChattimeStmp()) 0 else -1
}

Chatlist的结构图如下:

Firebase 中聊天列表的结构

用户结构图如下:

Firebase 中的用户结构

完整代码如下

class Messages : Fragment() {

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

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

    // Inflate the layout for this fragment
    val view = inflater.inflate(R.layout.fragment_messages, container, false)

    recycler_view_msgList = view.findViewById(R.id.recycler_view_msglist)
    recycler_view_msgList.setHasFixedSize(true)
    recycler_view_msgList.layoutManager = LinearLayoutManager(context)

    firebaseUser = FirebaseAuth.getInstance().currentUser

    usersMsgList = ArrayList()

    val ref = FirebaseDatabase.getInstance().reference.child("ChatList").child((firebaseUser!!.uid))
    ref.addValueEventListener(object : ValueEventListener {

        override fun onDataChange(p0: DataSnapshot) {

            (usersMsgList as ArrayList).clear()

            for (dataSnapshot in p0.children) {
                val messageList = dataSnapshot.getValue(MessageList::class.java)
                (usersMsgList as ArrayList).add(messageList!!)
            }

            retrieveMessageList()
        }

        override fun onCancelled(p0: DatabaseError) {

        }
    })

    updateToken(FirebaseInstanceId.getInstance().token)
    return view
}

private fun updateToken(token: String?)
{
    val ref = FirebaseDatabase.getInstance().reference.child("Tokens")
    val Token1 = Token(token!!)
    ref.child(firebaseUser!!.uid).setValue(Token1)
}

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()
          //  usersMsgList?.sortedBy { it.getChattimeStmp() }
            //Sorting of chatlist
            Collections.sort(usersMsgList!!, this@Messages::compare)
            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)
                    }
                }
            }

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

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



private fun compare(o1: MessageList, o2: MessageList): Int {

    return if (o1.getChattimeStmp()!! < o2.getChattimeStmp()!!) 1 else if (o1.getChattimeStmp() == o2.getChattimeStmp()) 0 else -1
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

    messages_fab.setOnClickListener{
        val intent = Intent(context, MyContacts::class.java)
        startActivity(intent)
    }

}

}

标签: androidfirebasekotlinfirebase-realtime-database

解决方案


推荐阅读