LiveData предназначена для хранения данных, и каждый раз, когда вы подписываетесь на нее, она возвращает данные, которые у нее есть в настоящее время. Как только вы вернетесь к своему фрагменту, данные, которые уже хранятся в LiveData, передаются обратно.
Вы можете решить эту проблему несколькими разными способами: вы можете использовать SingleLiveEvents, чтобы обернуть свой список и проверить, данные используются каждый раз, когда вы получаете новые данные внутри вашего фрагмента. Если он не используется, это означает sh новых данных, поступающих из ViewModel. Я использую что-то вроде этого:
class SingleLiveData<T>(dataToBeConsumed: T? = null) {
private var _data: T? = dataToBeConsumed
val isConsumed
get() = _data == null
fun consumeData(): T {
val curData = _data!!
_data = null
return curData
}
fun consumeDataSafely(): T? {
val curData = _data
_data = null
return curData
}
}
Это приведет к изменению ViewModel и вместо этого:
val mutableLiveData = MutableLiveData<SingleLiveData<List<News>>>()
И измените способ заполнения данных, например
viewModel.mutableLiveData.value = SingleLiveData(newsList)
В вашем коде вы проверите, есть ли данные isConsumed
перед обновлением RecyclerView.
//observe to the viewModel
viewModel.getNewsList(Timestamp.now()).observe(viewLifecycleOwner, Observer {
// Now it is SingleLiveData<List>
if (!it. isConsumed)
newsAdapter.submitList(it.consumeData())
})
Вы можете узнать больше о топах c: https://proandroiddev.com/singleliveevent-to-help-you-work-with-livedata-and-events-5ac519989c70
Другой подход - использовать DiffUtil при обновлении вашего recyclerView, это приведет только к обновлению новых объектов и не будет иметь дубликатов. Ссылка: https://blog.mindorks.com/the-powerful-tool-diff-util-in-recyclerview-android-tutorial
Не имеет отношения к вашей проблеме, я советую не хранить ссылку ViewModel в вашем FirebaseRepo, а возвращать данные с помощью лямбда-функции обратного вызова. Вы создаете зависимость cycli c, которая может вызывать ошибки и проблемы в вашем приложении.