Это происходит потому, что функции onDataChange()
имеют асинхронное поведение, что означает, что они вызываются даже до того, как вы пытаетесь добавить эти объекты в hostList
.Другими словами, к тому времени, когда вы пытаетесь использовать список вне функции onDataChange()
, данные еще не закончили загрузку из базы данных, и поэтому список всегда пуст.
Вы можете решить эту проблемупроблема в двух отношениях.Одним из способов было бы объявить и использовать список только внутри функции onDataChange()
, например:
ratingQuery?.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(databaseError: DatabaseError) {}
override fun onDataChange(dataSnapshot: DataSnapshot) {
val hostList = mutableListOf<Class>()
host?.myRating = if (dataSnapshot.value == null) 0 else (dataSnapshot.value as Long).toInt()
hostList.add(host!!)
//Do what you want with your list
}
})
Второй подход - создать собственный обратный вызов, ожидающий, пока Firebase вернет вам данные, ия рекомендую вам посмотреть последнюю часть моего ответа из этого поста , а также взглянуть на это видео .Ответ написан на Java, но схож с Котлином.