我已经成功地在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
方法,我会得到正确的Log
和RecyclerView
输出。
不知道出了什么问题,但肯定是我对Observer
方法做了两次更改。
通过这个实现,您将谷歌的所有工作都扔进了垃圾桶,因为您所做的是为ViewModel类提供MainActivity引用,而使用MVVM的主要目的是避免这个问题,以便在您的活动或片段被破坏时保持安全,并能够在屏幕评级时保存数据状态。因此,不要在ViewModel类中移动观察者代码——这不会"扰乱"活动。