我不知道我在哪里不正确地实现MediatorLiveData。
我有一个Repository类,它公开了一个可变的活动数据对象:
private MutableLiveData<List<UserTransaction>> mTransactionsLiveData
= new MutableLiveData<>();
public MutableLiveData<List<UserTransaction>> getTransactionsLiveData() {
return mTransactionsLiveData;
}我用getter传递了这个MutableLiveData对我的ViewModel类的引用:
public class UserTransactionsViewModel extends AndroidViewModel {
private LiveData<List<UserTransaction>> mTransactionsLiveData;
private SharedRepo mRepo;
public UserTransactionsViewModel(@NonNull Application application) {
super(application);
mRepo = new SharedRepo(application);
mTransactionsLiveData = mRepo.getTransactionsLiveData();
}
public LiveData<List<UserTransaction>> getTransactionsLiveData() {
return mTransactionsLiveData;
}
public void getUserTransactions(int userId) {
mRepo.getUserTransactions(userId);
}
}在我的片段类中,我观察到:
mViewModel.getTransactionsLiveData().observe(getViewLifecycleOwner(), new Observer<List<UserTransaction>>() {
@Override
public void onChanged(List<UserTransaction> list) {
//Observing it here
loadDataIntoRecycler(list);
}
});在我困惑的地方:
我现在试图添加一个MediatorLiveData来格式化ViewModel从Repository类接收的数据。
所以我首先在new MediatorLiveData<>()中添加了一个新的ViewModel
private MediatorLiveData<List<UserTransaction>> mediatorLiveData
= new MediatorLiveData<>();并附加了.addSource
private MediatorLiveData<List<UserTransaction>> mediatorLiveData = new MediatorLiveData<>();
public UserTransactionsViewModel(@NonNull Application application) {
super(application);
mRepo = new SharedRepo(application);
mTransactionsLiveData = mRepo.getTransactionsLiveData();
mediatorLiveData.addSource(mTransactionsLiveData, new Observer<List<UserTransaction>>() {
@Override
public void onChanged(List<UserTransaction> userTransactions) {
Log.d(TAG, "onChanged: Formatting data...");
for(int i = 0; i < list.size(); i++){
list.get(i).setTime("Changing time");
}
}
});
}我很困惑,我是否让片段中的观察者听MediatorLiveData,而不是LiveData?因为从未调用mediatorLiveData上的mediatorLiveData方法。
发布于 2021-03-06 06:28:57
mediatorLiveData上的.onChanged方法从未被称为.onChangedmediatorLiveData,并且还没有调用.onChanged方法,这意味着观测者从未改变过。永不改变意味着永不改变being setValue or postValue.如下所示:
mediatorLiveData.addSource(mTransactionsLiveData,
new Observer<List<UserTransaction>>() {
@Override
public void onChanged(List<UserTransaction> userTransactions) {
Log.d(TAG, "onChanged: Formatting data...");
for(int i = 0; i < list.size(); i++){
list.get(i).setTime("Changing time");
}
mediatorLiveData.setValue(list);
}
});或者,使用Transformations.map (和Java8lambda)可能更干净(同时从片段中观察到userTransactions ):
public LiveData<List<UserTransaction>> userTransactions;
userTransactions = Transformations.map(mTransactionsLiveData, list -> {
Log.d(TAG, "onChanged: Formatting data...");
for(int i = 0; i < list.size(); i++){
list.get(i).setTime("Changing time");
}
return list;
});发布于 2021-03-06 06:02:21
MediatorLiveData只观察它的源,而它是活动的(有一个活动的观察者),所以是的,您应该在片段中观察它。当没有活动观察者时,将不会调用onChanged。
https://stackoverflow.com/questions/66502468
复制相似问题