我有一个 recyclerView,用于保存用户的通知。新通知具有彩色背景,而旧通知具有白色背景。我的数据库保存有关每个通知的信息,说明它是否是新的(简单地唱 0 表示新的,1 表示看到的)。
我在顶部有一个“标记为已读”按钮。单击时,我有一个用于用户通知的监听器,并且在添加的每个 child 上,它都会将该 child 的值从 0 更改为 1。 完成后,我想重新填充 recyclerView,以便所有通知都具有适当的背景(白色 - 用于旧通知)。
我有一个单独的函数,它还通过一个子事件监听器来监听通知,并且我正在对前一个函数添加的每个子元素调用该函数。
现在的结果应该是我所描述的 - 对于每个添加的 child ,通知监听器被调用,然后它加载所有通知,所以我理所当然地最终应该得到实际通知数量的平方。我感到困惑的原因是因为每次调用监听通知功能时我都会清除适配器,据我所知,只有最后一次调用该函数应该坚持,因为之前的所有调用都已清除,但是事实并非如此。
希望能帮助理解为什么会发生这种情况。谢谢!
notifications_mark_all_as_read.setOnClickListener {
refFeedNotifications.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(p0: DataSnapshot) {
for (i in p0.children) {
val notificationsRef =
FirebaseDatabase.getInstance()
.getReference("/users/$uid/notifications/gallery/${i.key}/seen")
notificationsRef.setValue(1)
notificationsRecyclerAdapter.clear()
listenToNotifications()
}
}
override fun onCancelled(p0: DatabaseError) {}
})
}
private fun listenToNotifications() {
notificationsRecyclerAdapter.clear()
refFeedNotifications.addChildEventListener(object : ChildEventListener {
override fun onChildAdded(p0: DataSnapshot, p1: String?) {
val notification = p0.getValue(Notification::class.java)
if (notification != null) {
notificationsRecyclerAdapter.add(SingleFeedNotification(notification, activity as MainActivity))
}
}
override fun onCancelled(p0: DatabaseError) {
}
override fun onChildMoved(p0: DataSnapshot, p1: String?) {
}
override fun onChildChanged(p0: DataSnapshot, p1: String?) {
}
override fun onChildRemoved(p0: DataSnapshot) {
}
})
}
最佳答案
在将监听器分配给数据库引用后,firebase ChildEventListener
上的
function onChildAdded
将始终至少为每个 child 调用一次。
因此在您的情况下,在您清除列表后,onChildAdded
将在您的列表中添加每个通知数据,因为您为数据库引用分配了一个新的监听器
关于android - Recyclerview 适配器加载了数据库中对象数量的平方(例如 5 为 25,4 为 16 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55913788/