android - Recyclerview 适配器加载了数据库中对象数量的平方(例如 5 为 25,4 为 16 等)

标签 android firebase-realtime-database kotlin android-recyclerview

我有一个 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/

相关文章:

ios - 检测连接状态被调用两次

android - Moshi:解析单个对象或对象列表 (kotlin)

android - Kotlin中的构造函数泛型

android - Renderscript 模糊警告

java - 使用未指定的索引。您的数据将在客户端下载并过滤。即使我添加了 .indexOn

android - 如何使用 ObjectAnimator 缩小 ImageView,但保持其在布局中的位置?

ios - 如何加入多个 observeSingleEvent() 调用结果并在所有调用完成后执行操作?

ios - 如何知道在 swift 4 中实时 firebase 的 childChanged 事件类型中更新了哪个子子

android - 使用 Android.bp 而不是 Android.mk 将应用程序构建到 Android 系统中

android - 使用Android Clean Architecture处理来自API的错误和成功响应