首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVVM - MediatorLiveData onChanged未被调用

MVVM - MediatorLiveData onChanged未被调用
EN

Stack Overflow用户
提问于 2021-03-06 04:44:51
回答 2查看 973关注 0票数 1

我不知道我在哪里不正确地实现MediatorLiveData。

我有一个Repository类,它公开了一个可变的活动数据对象:

代码语言:javascript
复制
private MutableLiveData<List<UserTransaction>> mTransactionsLiveData
        = new MutableLiveData<>();

public MutableLiveData<List<UserTransaction>> getTransactionsLiveData() {
    return mTransactionsLiveData;
}

我用getter传递了这个MutableLiveData对我的ViewModel类的引用:

代码语言:javascript
复制
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);
    }


}

在我的片段类中,我观察到:

代码语言:javascript
复制
mViewModel.getTransactionsLiveData().observe(getViewLifecycleOwner(), new Observer<List<UserTransaction>>() {
            @Override
            public void onChanged(List<UserTransaction> list) {

                //Observing it here

                loadDataIntoRecycler(list);
            }
        });

在我困惑的地方:

我现在试图添加一个MediatorLiveData来格式化ViewModelRepository类接收的数据。

所以我首先在new MediatorLiveData<>()中添加了一个新的ViewModel

代码语言:javascript
复制
private MediatorLiveData<List<UserTransaction>> mediatorLiveData
        = new MediatorLiveData<>();

并附加了.addSource

代码语言:javascript
复制
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方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-06 06:28:57

because it's not observed.

  1. mediatorLiveData上的.onChanged方法从未被称为.onChanged

  1. ,如果您已经尝试从片段中观察mediatorLiveData,并且还没有调用.onChanged方法,这意味着观测者从未改变过。永不改变意味着永不改变being setValue or postValue.

如下所示:

代码语言:javascript
复制
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 ):

代码语言:javascript
复制
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;
        });
票数 4
EN

Stack Overflow用户

发布于 2021-03-06 06:02:21

MediatorLiveData只观察它的源,而它是活动的(有一个活动的观察者),所以是的,您应该在片段中观察它。当没有活动观察者时,将不会调用onChanged。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66502468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档