Изменяемый список не обновляется при добавлении элементов списка из onsucclistener

#android #list #kotlin #android-recyclerview #google-cloud-firestore

# #Android #Список #kotlin #android-recyclerview #google-облако-firestore

Вопрос:

Я пытаюсь прочитать все документы из коллекции базы данных firestore и передать результаты в изменяемый список моего объекта «Message», который будет использоваться в моем адаптере представления Recycler, но метод .add() не работает, и список не изменяется при изменении в onsucclistener. хотелось бы, чтобы некоторыесправка

 private fun getMessages(){
    messageCollecion.get()
        .addOnSuccessListener { documents->
            for(document in documents){
                val currentUser = document.getString(KEY_USER)
                val currentMessage = document.getString(KEY_MESSAGE)
                val message = Message(currentUser, currentMessage)
                messageList.add(message)
            }
        }
        .addOnFailureListener {
            Log.d("FireStoreFetchError", "Exception", it)
            Toast.makeText(this, "Failed to fetch", Toast.LENGTH_SHORT).show()
        }
}
 

Комментарии:

1. вы проверили, действительно ли ваш слушатель возвращает данные addOnSuccessListener ? то есть, documents на самом деле есть данные?

2. Как вы проверяете список?

3. @AlexMamo Я проверил журналы и тосты, а также добавление из любого места за пределами слушателя сработало

4. @MehranBehbahani да, я проверил с помощью всплывающего сообщения отображение значения ключа, и оно работало

5. Итак, вы говорите, что где-либо за пределами слушателя не работает, верно?

Ответ №1:

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

 override fun onStart() {
    super.onStart()
    messageCollecion.orderBy(KEY_TIME, Query.Direction.ASCENDING).addSnapshotListener(this, EventListener { value, error ->
        if (error != null){
            Log.e("SnapshotListener Error","Exception", error)
            return@EventListener
        }
        else if (value != null){
            messageList.clear()
            for (document in value){
                val currentUser = document.getString(KEY_USER)
                val currentMessage = document.getString(KEY_MESSAGE)
                val message = Message(currentUser, currentMessage)
                messageList.add(message)
                chatBoxView.adapter?.notifyDataSetChanged()
                chatBoxView.scrollToPosition(chatBoxView.adapter!!.itemCount - 1)
            }
        }
    })
}
 

Ответ №2:

сначала проверьте, действительно ли ваш MessageList является изменяемым списком

во-вторых, после каждого изменения MessageList вы должны уведомлять свой адаптер об изменении с помощью: messagesAdapter.notifyDataSetChanged()

вы можете найти лучший способ уведомления вашего адаптера, проверьте здесь: https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView .Адаптер#notifyDataSetChanged()

Комментарии:

1. Я не думаю, что вопрос в том, почему данные не отображаются в recyclerview. проблема в том, что значения не добавляются в список.

2. Это изменяемый список, потому что с помощью . метод добавления я могу добавлять элементы из любой другой части файла и тестировал также с объявленными данными в автономном режиме. представление recycler в порядке, и с помощью этого метода я просто заполняю список из базы данных перед установкой адаптера

3. итак, основываясь на ваших предыдущих ответах (вызывается слушатель, а список является изменяемым, связь между списком и представлением в порядке) Я могу предположить, что вы допустили опечатку, неправильное назначение списка или другую простую ошибку. Без полного кода трудно сказать наверняка.