android - 以预定义的顺序获取用户 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的结构图如下:
用户结构图如下:
完整代码如下
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)
}
}
}
解决方案
推荐阅读
- c - 结构和数组中的结构
- java - 从支持 bean 更新输入组件
- reactjs - 如何使用 GatsbyJS 和 GraphQL 查询和显示包含多个图像的文件夹
- python-3.x - 使用 pandas 处理重复数据
- node.js - 如何在firebase函数中将参数传递给cors
- html - 有谁知道如何用 CSS 绘制这些类型的箭头?
- google-apps-script - 复制整个电子表格,只保留值
- api - 我在尝试从具有 JWT 令牌的 API 发出 GET 请求时收到错误 401(未经授权)
- php - 使用 media_handle_upload 将 blob 文件上传到 wordpress
- graph-databases - Gremlin - 更新多条边的值