Я создаю приложение для Android с действием с нижним элементом управления навигацией, который позволяет пользователю перемещаться между различными фрагментами.В этих фрагментах у меня есть списки данных, поступающих из бэкэнда Firebase, которые я показываю с RecyclerView
.Проблема в том, что каждый раз, когда я перемещаюсь между этими фрагментами, все данные загружаются снова, в то время как я хотел бы использовать кэшированные данные и просто прослушивать изменения.
То, что я сделал до сих пор, это использование ViewModel
и LiveData
и они работают нормально.Более того, если я отключаю телефон от Интернета, данные показываются (и, конечно, не загружаются), даже если я перемещаюсь между фрагментами.
Во фрагменте, который показывает данные, которые у меня есть:
LiveData<List<UncompletedTask>> taskLiveData = viewModel.getTaskLiveData();
taskLiveData.observe(this, new Observer<List<UncompletedTask>>() {
@Override
public void onChanged(List<UncompletedTask> uncompletedTasks) {
myAdapter.submitList(uncompletedTasks);
listener.onTodoListElementsLoaded(uncompletedTasks.size());
}
});
В модели представления у меня есть:
private TodoTaskRepository repository;
@NonNull
public LiveData<List<UncompletedTask>> getTaskLiveData() {
return repository.getTaskLiveData();
}
В TodoTaskRepository
я инициализирую FirebaseQueryLiveData
в конструкторе и возвращаю его в getTaskLiveData()
.Наконец, FirebaseQueryLiveData
выглядит следующим образом:
public class FirebaseQueryLiveData extends LiveData<DataSnapshot> {
private static final String LOG_TAG = "FirebaseQueryLiveData";
private final Query query;
private final MyValueEventListener listener = new MyValueEventListener();
public FirebaseQueryLiveData(Query query) {
this.query = query;
}
@Override
protected void onActive() {
query.addValueEventListener(listener);
}
@Override
protected void onInactive() {
query.removeEventListener(listener);
}
private class MyValueEventListener implements ValueEventListener {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
setValue(dataSnapshot);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e(LOG_TAG, "Can't listen to query " + query, databaseError.toException());
}
}
}
Как я могу загрузить все данные в первый раз, а затем просто слушать изменения и не загружать одни и те же данные при навигации между фрагментами, если ничего не изменилось?