如何在ViewModel中使用观察者方法解决“从观察者派生的匿名类”错误

时间:2019-01-28 13:09:04

标签: java android observable android-room

我已经在MainActivity()中成功使用了一个观察者方法,如下所示:

public void inputNameTest(String inputName) {
    myViewModel.inputNameTesting(inputName).observe( this, new Observer<List<MyRoomEntity>>() {
        @Override
        public void onChanged(@Nullable List<MyRoomEntity> myRoomEntities) {
            //Sets data in RecyclerView
            myAdapter.setList( myRoomEntities );
        }
    } );
}

这会将用户输入的数据设置为Room查询,并在RecyclerView中显示查询。我想将函数移至ViewModel,以防止View混乱。

ViewModel中,我在new Observer<List<MyRoomEntity>>()上有一个红色下划线,上面写着anonymous class must either be declared abstract or implement abstract method

如果我将Observer更改为new android.arch.lifecycle.Observer<List<MyRoomEntity>>()(如Android-Studio所建议),则红色下划线消失。

我还需要传递一个owner参数而不是this。我通过从this传递MainActivity()来解决这个问题

myViewModel.setOwner( this );

到我的ViewModel

public void setOwner(LifecycleOwner owner) {
    this.mOwner = owner;
}

完成后,Observer中的ViewModel方法如下:

public void getUserInputName(String inputName) {
    repository.getUserInputName(inputName).observe( mOwner, new android.arch.lifecycle.Observer<List<MyRoomEntity>>() {
        @Override
        public void onChanged(@Nullable List<MyRoomEntity> myRoomEntities) {

            Log.d("TAG", "OBSERVED INPUT NAME");
            if(myRoomEntities != null) {
                for(MyRoomEntity item: myRoomEntities) {
                    Log.d("TAG ROOM ", "Input Name: " + item.toString());
                }
            }
            myAdapter.setList( myRoomEntities );

        }
    } );
}

不会产生错误,但是由于某些原因,RecyclerView中什么也没有显示。我确实从Log方法中获得了正确的Observer输出:

Input Name: MyRoomEntity{id=2, name='Joe', date='1/3/2015', from='12.30', until='13:00'}

因此,如果我在EditText框中写“ Joe”并按一个按钮,则RecyclerView中什么也没有显示,但我确实得到了正确的Log。如果将Observer方法保留在MainActivity()中,则会得到正确的LogRecyclerView输出。

不知道出了什么问题,但这必须与我对Observer方法所做的两个更改有关。

1 个答案:

答案 0 :(得分:1)

通过此实现,您将所有Google的工作都丢了,因为您要做的是提供对ViewModel类的MainActivity引用,并且使用MVVM的要点是避免此问题的发生,以防万一您的活动或片段被破坏并被破坏。能够在屏幕批准的情况下保存数据状态。 因此,不要在ViewModel类内移动观察者代码,因为这不会“搞乱”活动。