如何在视图模型中使用观察器方法解决"anonymous class derived from observer"错误



我已经成功地在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。我通过从MainActivity()传递this来管理它

myViewModel.setOwner( this );

到我的ViewModel

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

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

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中没有显示任何内容。我确实从Observer方法得到了正确的Log输出:

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

因此,如果我在EditText框中写下"Joe"并按下按钮,RecyclerView中不会显示任何内容,但我确实得到了正确的Log。如果我在MainActivity()中保留Observer方法,我会得到正确的LogRecyclerView输出。

不知道出了什么问题,但肯定是我对Observer方法做了两次更改。

通过这个实现,您将谷歌的所有工作都扔进了垃圾桶,因为您所做的是为ViewModel类提供MainActivity引用,而使用MVVM的主要目的是避免这个问题,以便在您的活动或片段被破坏时保持安全,并能够在屏幕评级时保存数据状态。因此,不要在ViewModel类中移动观察者代码——这不会"扰乱"活动。

相关内容

最新更新