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/

相关文章:

android - 不满意的链接错误 - 找不到库

Android:launchMode ="singleTask"的行为与描述不符?

android - 使用游标适配器实现具有多个选择和过滤器的 ListView

android - Kotlin 中硬关键字和软关键字的区别

android - java.lang.IllegalStateException : Function not found androidx. compose.internal.restartableFunctionInstance 错误

android - 在Android中使用OpenCV运行C/C++代码

java - 使用来自 firebase 的回收 View 和值时没有此类方法错误

javascript - 单元测试 firebase 函数 : how to stub firebase-admin sdk

android - 想在从 firebase 检索数据时对列表进行限制

kotlin - 将类中使用的接口(interface)列表传递给构造函数