Адаптер Recyclerview загружается с квадратом количества объектов в базе данных (например, 25 для 5, 16 для 4 и т. Д.) - PullRequest
2 голосов
/ 30 апреля 2019

У меня есть ресайклер Просмотр сообщений пользователя. Новое уведомление имеет цветной фон, а старое - белый. Моя база данных содержит информацию о каждом уведомлении, сообщающее, является ли оно новым (просто спойте 0 для нового и 1 для увиденного).

У меня сверху кнопка «Пометить все как прочитанное». При щелчке у меня есть прослушиватель уведомлений пользователя, и при каждом добавлении дочернего элемента значение этого дочернего элемента изменяется с 0 на 1. Когда это будет сделано, я хотел бы заново заполнить recyclerView, чтобы все уведомления имели надлежащий фон (белый - для старых уведомлений).

У меня есть отдельная функция, которая также прослушивает уведомления с помощью дочернего прослушивателя событий, и я вызываю эту функцию для каждого дочернего элемента, добавленного к предыдущей функции.

Теперь результат этого ДОЛЖЕН БЫТЬ тем, что я описал - для каждого добавленного дочернего элемента вызывается прослушиватель уведомлений, а затем он загружает все уведомления, поэтому, если я получу в итоге квадрат с количеством действительных уведомлений. Причина, по которой я запутался, заключается в том, что я очищаю адаптер каждый раз, когда вызывается функция прослушивания уведомлений, так что, насколько я понимаю, должен оставаться только последний раз, когда вызывается функция, потому что все предыдущие вызовы были очищены, но это не так.

Буду признателен за понимание того, почему это происходит. Спасибо!

        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) {
            }
        })
    }

1 Ответ

0 голосов
/ 30 апреля 2019

функция onChildAdded на базе Firebase ChildEventListener всегда будет вызываться как минимум один раз для каждого ребенка после назначения слушателю ссылки на базу данных.

Таким образом, в вашем случае, после очистки вашего списка, onChildAdded добавит все данные уведомлений в ваш список, потому что вы назначаете нового слушателя для ссылки на базу данных

...