Проблема с индексом в mutableListOf с LiveData и ViewModel

#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 могло произойти или нет, скорее всего, нет.