Чтобы достичь того, что вы пытаетесь сделать, вам нужны три вещи. Действие/фрагмент, которое отправит значение в ViewModel
, ViewModel
, и действие/фрагмент, которое извлечет данные из ViewModel
. Допустим, ваши данные хранятся в ArrayList
, и вы хотите обновить и получить их из разных фрагментов.
Во-первых, мы должны реализовать ViewModel
. Он содержит данные, которыми вы хотите поделиться между своими действиями/фрагментами. Вы объявляете MutableLiveData
как ArrayList
, а затем инициализируете его.
class testviewmodel : ViewModel() {
val list: MutableLiveData<ArrayList<String>> = MutableLiveData()
init {
list.value = arrayListOf()
}
}
Наш следующий шаг — получить доступ и обновить ArrayList
, используя вашу активность:
val viewmodel = ViewModelProviders.of(this).get(testviewmodel::class.java)
// update the array in Viewmodel
viewmodel.list.postValue(yourarray)
Если вы используете Fragment
для его обновления, используйте это:
activity?.let {
val viewmodel = ViewModelProviders.of(it).get(testviewmodel::class.java)
// update the array in Viewmodel
viewmodel.list.postValue(yourarray)
}
Наконец, чтобы получить данные из ViewModel
во фрагменте, поместите это внутрь вашего onViewCreated
:
activity?.let {
val viewmodel = ViewModelProviders.of(it).get(Dbviewmodel::class.java)
observeInput(viewmodel)
}
Поместите это вне вашего onViewCreated
:
private fun observeInput(viewmodel: testviewmodel ) {
viewmodel.list.observe(viewLifecycleOwner, Observer {
it?.let {
if (it.size > 5) {
pos = it[5]
//grab it
Toast.makeText(context,pos,Toast.LENGTH_LONG).show()
//display grabbed data
}
}
})
}
Взгляните на эти документы для получения дополнительной информации о ViewModels
Удачи! ! Надеюсь, это поможет :)
person
Uni
schedule
01.09.2019