#kotlin
Вопрос:
В моем классе данных у меня есть
var education: MutableLiveData<ArrayList<DocRegEducation>> =
MutableLiveData(ArrayList<DocRegEducation>()),
во фрагменте я добавляю ценность
docViewModel.doctorRegisterModel.value?.education?.value?.add(doc_reg_edu)
и наблюдая
docViewModel.doctorRegisterModel.value?.education?.observe(viewLifecycleOwner, Observer {
it?.let {
logd("reached education changes observed")
educationAdapter.setData(it) }
})
но изменений не наблюдается
Комментарии:
1. Наблюдатель будет работать, когда вы зададите значение (мы также можем назвать его изменением ссылки) изменяемых живых данных, которые являются вашим списком, а не элементами в списке, вы добавляете элементы в список, не изменяя весь список.
2. добавление элементов в список arraylist также изменяет список arraylist правильно
3. да, изменение списка массивов, а не ссылки на список массивов, но наблюдатель будет работать, если мы изменим ссылку на список массивов.
4. итак, как изменить список массивов вместо ссылки, которая находится в классе данных
5. Просто используйте переменную состояния, которая поможет вам уведомить список или установить новые данные, например, используйте изменяемые текущие данные с long, и когда вы добавляете элемент в список, затем обновите время для длинных изменяемых текущих данных, и на этом наблюдателе вы можете использовать данные набора для списка
Ответ №1:
В ViewModel:
val educationList = ArrayList<DocRegEducation>()
val educationListState = MutableLiveData<Long>(0L)
fun setNewData(data:DogRegEducation){
// adding data for list here
educationList.add(data);
// changing state with respect to time value to observe on view side
educationListState.value = System.currentTimeMillis()
}
Со Стороны Обзора:
docViewModel.educationListState.observe(viewLifecycleOwner, Observer {
// update the adapter on state change when item is added
educationAdapter.setData(docViewModel.educationList)
})
Ответ №2:
Это очень распространенная проблема для всех новых разработчиков Kotlin (включая меня). Здесь ссылка на массив все та же. Таким образом, вам нужно создать новый массив для каждого изменения элемента и опубликовать его снова.
Вот пример.
private val _lstAvailability: MutableLiveData<List<AppointmentsItem>> =
MutableLiveData(emptyList())
// Create new mutable list reference
val duplicateList: MutableList<AppointmentsItem> = mutableListOf()
// add all possible AppointmentsItem info here like
duplicate.add(AppointmentsItem("item1"))
duplicate.add(AppointmentsItem("item2"))
duplicate.add(AppointmentsItem("item3"))
// Copy the old items into duplicate list, if needed
_lstAvailability.value.forEach {duplicateList.add(it.copy())}
//Finally update your livedata with new reference
_lstAvailability.value = duplicateList