#android #firebase #kotlin #mvvm
#Android #firebase #kotlin #mvvm
Вопрос:
Я получаю данные из Firebase с помощью ViewModel, и когда я пытаюсь связать данные с TextView, я вижу следующую ошибку.
java.lang.RuntimeException: не удается запустить activity ComponentInfo{com.example.pruebafirebase/com.example.pruebafirebase .MainActivity}: java.lang.Исключение IndexOutOfBoundsException: индекс: 0, Размер: 0
class MainActivity : AppCompatActivity() {
private val viewModel by lazy {ViewModelProvider(this).get(MyViewModel::class.java)}
private var dataList = mutableListOf<User>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel.fetchUserData().observe(this, Observer {it: MutableList<User>!
dataList = it
})
bindView(dataList[0])
}
fun bindView(users: User) {
nameOne.text = users.name
lastOne.text = users.last
}
}
Комментарии:
1. Переместитесь
bindView(dataList[0])
внутрь вашей функции наблюдателя. В противном случае вы пытаетесь получить значение до того, как что-либо будет добавлено в список.2. Отлично, я больше часа пытался разобраться. Спасибо
Ответ №1:
Проблема observer
в том, что это асинхронная операция, так что это может произойти после выполнения строки bindView
.
viewModel.fetchUserData().observe(this, Observer {it: MutableList<User>!
bindView(dataList[0])
})
Строки кода записываются линейным способом, но выполнение кода не является линейным, к моменту выполнения предыдущего bindView(dataList[0])
observer
было установлено указанное выше, но dataList = it
могло произойти или нет, скорее всего, нет.