#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. итак, основываясь на ваших предыдущих ответах (вызывается слушатель, а список является изменяемым, связь между списком и представлением в порядке) Я могу предположить, что вы допустили опечатку, неправильное назначение списка или другую простую ошибку. Без полного кода трудно сказать наверняка.