Я следил за великолепным блогом @Doug Stevenson, и теперь я успешно использую LiveData и ViewModel для получения данных из базы данных Firebase и наблюдения за данными в моем фрагменте. Теперь мне нужно прочитать данные из новой ссылки в базе данных. Однако LiveData продолжает извлекать данные из исходного местоположения.
Вот мой код ViewModel:
public class BoysViewModel extends ViewModel {
private static final DatabaseReference BOYS_REF =
FirebaseDatabase.getInstance().getReference().child(**GlobalVars.appUser.getCurrentId()**).child("boys");
private final FirebaseLiveData liveData = new FirebaseLiveData(BOYS_REF);
private final LiveData<List<Boy>> boyLiveData =
Transformations.map(liveData, new Deserializer());
private class Deserializer implements Function<DataSnapshot, List<Boy>> {
@Override
public List<Boy> apply(DataSnapshot dataSnapshot) {
List<Boy> temp = new ArrayList<>();
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
Boy post = postSnapshot.getValue(Boy.class);
post.setKidKey(postSnapshot.getKey());
temp.add(post);
}
return temp;
}
}
@NonNull
public LiveData<List<Boy>> getBoysLiveData() {
return boyLiveData;
}
}
FirebaseLiveData - это класс, расширяющий LiveData
public class FirebaseLiveData extends LiveData<DataSnapshot> {
private static final String LOG_TAG = "FirebaseLiveData";
private final Query query;
private final FirebaseLiveData.MyValueEventListener listener = new FirebaseLiveData.MyValueEventListener();
FirebaseLiveData(Query ref) {
this.query = ref;
}
public FirebaseLiveData(DatabaseReference ref) {
this.query = ref;
}
@Override
protected void onActive() {
Log.d(LOG_TAG, "onActive");
query.addValueEventListener(listener);
}
@Override
protected void onInactive() {
Log.d(LOG_TAG, "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());
}
}
}
В моем фрагменте onResume:
BoysViewModel model = new ViewModelProvider(requireActivity()).get(BoysViewModel.class);
LiveData<List<Boy>> boyLiveData = model.getBoysLiveData();
boyLiveData.observe(getViewLifecycleOwner(), new Observer<List<Boy>>() {
@Override
public void onChanged(List<Boy> changedBoys) {...
В другой части моего приложения я изменяю ссылку BOYS_REF (вторая строка в BoysViewMode), изменяя GlobalVars.appUser.getCurrentId (), и снова запускаю фрагмент. Фрагмент проходит через методы начального жизненного цикла и также вызывает onResume. Но LiveData по-прежнему указывает на старые данные из предыдущего пути.
Как я могу изменить свой код, чтобы получать обновления LiveData с новым путем?
Заранее спасибо.