Невозможно наблюдать изменения в изменяемом списке текущих данных

#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