如何从Firebase实时数据库的多个节点填充RecyclerView?

qyyhg6bp  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(114)

我正在寻找一种填充我的RecyclerView的方法。我知道如何从数据库的单个节点填充RecyclerView,但我想知道如何从多个节点获取数据。在我的应用程序中,用户可以选择多个爱好。我希望根据用户选择的爱好填充回收者视图。
下面是数据库x1c 0d1x中用户节点的图片
正如你可以看到我的用户选择了爱好咖啡馆,露营,徒步旅行
我有一个名为“位置”的节点,它有六个子节点:咖啡馆、露营、徒步旅行、博物馆、夜生活和餐馆。
我从这个代码块中获取用户的爱好

val currentuid = FirebaseAuth.getInstance().currentUser!!.uid
        val getCurrentUserHobbies =
            FirebaseDatabase.getInstance().getReference("users/$currentuid/hobbies")
        getCurrentUserHobbies.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                val value = snapshot.getValue(String::class.java)
                val valueAsString = value.toString()
                if (valueAsString.contains("Hiking")){

                }

            }

            override fun onCancelled(error: DatabaseError) {

            }

        })

如果我想让我的回收者视图显示所有徒步旅行地点,我可以这样做:

val adapter = GroupAdapter<GroupieViewHolder>()

        val hikingRef = FirebaseDatabase.getInstance().getReference("Locations/Hiking")
        hikingRef.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                for (snap in snapshot.children) {
                    val recommendItems = snap.getValue(RecommendationsClass::class.java)
                    if (recommendItems != null) {
                        adapter.add(RecommendationsAdapter(recommendItems))
                    }
                }
                recommendationsRecyclerView.adapter = adapter
            }

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

现在,如果用户选择了徒步旅行和露营为例。我希望我的回收视图显示从节点位置/徒步旅行和位置/露营的所有位置。我尝试了多个,但没有工作。我不打算写在这里,因为它会占用太多的空间。我试图保持我的问题尽可能简单。
先谢了!

tf7tbtn2

tf7tbtn21#

很遗憾,我找不到任何可行的解决方案。我不得不做一些不同的事情。我所做的是从我的位置节点复制子节点,并根据我当前用户的爱好将它们放在users/currentuid/Recommendations中。
下面是执行此操作的代码片段:

val currentuid = FirebaseAuth.getInstance().currentUser!!.uid
        val getCurrentUserHobbies = FirebaseDatabase.getInstance().getReference("users/$currentuid/hobbies")
        getCurrentUserHobbies.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                val value = snapshot.getValue(String::class.java)
                val valueAsString = value.toString()
                if (valueAsString.contains("Caffe's")) {
                    val ref = FirebaseDatabase.getInstance().getReference("Locations/Caffe's/")
                    ref.addListenerForSingleValueEvent(object : ValueEventListener {
                        override fun onDataChange(dataSnapshot: DataSnapshot) {
                            for (snap in dataSnapshot.children) {
                                val data = dataSnapshot.value
                                val newData = mapOf("Recommendations/${dataSnapshot.key}" to data)
                                FirebaseDatabase.getInstance().getReference("users")
                                    .child(currentuid).updateChildren(newData)
                            }
                        }

                        override fun onCancelled(databaseError: DatabaseError) {
                            // Handle error
                        }
                    })
                }
                if (valueAsString.contains("Camping")) {
                    val ref = FirebaseDatabase.getInstance().getReference("Locations/Camping/")
                    ref.addListenerForSingleValueEvent(object : ValueEventListener {
                        override fun onDataChange(dataSnapshot: DataSnapshot) {
                            for (snap in dataSnapshot.children) {
                                val data = dataSnapshot.value
                                val newData = mapOf("Recommendations/${dataSnapshot.key}" to data)
                                FirebaseDatabase.getInstance().getReference("users")
                                    .child(currentuid).updateChildren(newData)
                            }
                        }

                        override fun onCancelled(databaseError: DatabaseError) {
                            // Handle error
                        }
                    })
                }
                if (valueAsString.contains("Hiking")) {
                    val ref = FirebaseDatabase.getInstance().getReference("Locations/Hiking/")
                    ref.addListenerForSingleValueEvent(object : ValueEventListener {
                        override fun onDataChange(dataSnapshot: DataSnapshot) {
                            for (snap in dataSnapshot.children) {
                                val data = dataSnapshot.value
                                val newData = mapOf("Recommendations/${dataSnapshot.key}" to data)
                                FirebaseDatabase.getInstance().getReference("users")
                                    .child(currentuid).updateChildren(newData)
                            }

                        }

                        override fun onCancelled(databaseError: DatabaseError) {
                            // Handle error
                        }
                    })
                }

            }

            override fun onCancelled(error: DatabaseError) {

            }
        })

上面的代码做了什么,它检查caffe的camping和hiking是否存在于我的users/currentuid/hobbits节点中,如果存在,它从Locations复制数据并将其放在users/currentuid/Recommendations中。
注意:我还必须检查剩下的三个爱好。我只把其中三个用于测试目的。
这里还有一张图片展示了我的做法

在此之后,我只循环了我的Recommendations节点,并使用以下代码片段将所有位置添加到我的Recycler视图中:

val recommendedLocations = FirebaseDatabase.getInstance().getReference("users/$currentuid/Recommendations")
        recommendedLocations.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                for (parentSnapshot in snapshot.children) {
                    for (childSnapshot in parentSnapshot.children) {
                        val recommendItems = childSnapshot.getValue(RecommendationsClass::class.java)
                        if (recommendItems != null) {
                            adapter.add(RecommendationsAdapter(recommendItems))
                        }
                    }
                }
                recommendationsRecyclerView.adapter = adapter
            }
            override fun onCancelled(error: DatabaseError) {
            }
        })

相关问题