【发布时间】:2019-01-28 13:09:04
【问题描述】:
我在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 方法所做的两个更改。
【问题讨论】:
标签: java android observable android-room