Android 是否通知ViewModel模型更新?

Android 是否通知ViewModel模型更新?,android,mvvm,firebase,firebase-realtime-database,android-databinding,Android,Mvvm,Firebase,Firebase Realtime Database,Android Databinding,我目前正在开发一个应用程序,它使用Firebase的实时数据库和数据绑定来显示。为了简单起见,这里有一个问题的简单版本: 给定一个模型类: public class User { private String name; private Date date; public String getName() { return name; } public void setName(String name) { this.name = name; } pub

我目前正在开发一个应用程序,它使用Firebase的实时数据库和数据绑定来显示。为了简单起见,这里有一个问题的简单版本:

给定一个模型类:

public class User {
    private String name;
    private Date date;

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public Date getDate() { return date; }
    public void setDate(Date date) { this.date = date; }
}
以及用户的ViewModel类:

public class UserViewModel {
    private User user;
    public void setUser(User user) {
        this.user = user;
    }

    public String getName() { return user.getName() }
    public void setName(String name) { user.setName(name); }
    public String getDateAsString() { // ... }
}
现在,在activity/fragment中,我有一个
RecyclerView
呈现用户列表。因此,在适配器的
onCreateViewHolder()
中,我使用
DataBindingUtils
膨胀布局,创建一个新的
ViewHolder
和一个访问UI的新的
UserViewModel
实例。在onBindViewHolder()中,
UserViewModel
被分配相应的用户实例

到目前为止,还不错:给定一个用户列表,它的项目通过
UserViewModel
呈现到
RecyclerView

对于应用程序,我还使用Firebase读取和写入实时数据库。因此,当我现在得到一个
User
条目已更新的回调时,我直接修改相应实例中的infos

现在我们来讨论这个问题:如何通知
UserViewModel
数据已更改,需要在UI中重新绘制相应的视图?

我知道我需要做的一步是让
UserViewModel
扩展
BaseObservable
,用
@Bindable
标记方法,并在ViewModel的setter中添加对
notifyPropertyChanged(int)
的调用。但这并不能解决如何通知
UserViewModel
模型数据更新的问题


任何帮助和示例代码都将不胜感激!Thx!:)

如果我理解正确,您可以看看如何使用RxJava/RxAndroid订阅viewModel,使其适应模型类或firebase实例中的更改(它们应该是可见的)。例如,当您想让viewModel知道firebase有一个新用户并且用户条目已更新时,您可以从该回调调用viewModels onNext方法,该方法将通知订阅它的viewModel,并运行您想要运行的方法(如获取数据),然后,使用base observable,您可以通知您的列表。

如果我理解正确,您可以查看使用RxJava/RxAndroid订阅viewModel以更改模型类或firebase实例(它们应该是可观察的)。例如,当您想让viewModel知道firebase有一个新用户并且用户条目已更新时,您可以从该回调调用viewModels onNext方法,该方法将通知订阅它的viewModel,并运行您想要运行的方法(如获取数据),然后使用BaseObservable,您可以通知列表。

您不需要使用
BaseObservable
扩展
UserViewModel
,但您可以。我将展示另一种方法如何实现这一点

就个人而言,我更喜欢在我的
UserViewModel
中创建一个
observefield
,创建getter和setter,如:

private final ObservableField<User> userField = new ObservableField<User>();

public UserViewModel(User user){
    userField.set(user);
}

public ObservableField<User> getUser(){
    return userField;
}
private final observefield userField=new observevefield();
公共用户视图模型(用户){
userField.set(用户);
}
公共observeField getUser(){
返回用户字段;
}
将其传递到布局并参照如下属性:

<variable
    name="userViewModel"
    type="your.package.UserViewModel" />

<EditText
    android:text"@={userViewModel.user.name}" />

每当您的用户在您的
编辑文本中更改其
名称
,这些更改也会在您的模型中更新。(使用带有
@={}
的双向数据绑定)


更新为使用
observefield
,感谢您的提醒,@tynn。如果我还是错的话,请纠正我

您不需要使用
BaseObservable
扩展
UserViewModel
,但您可以。我将展示另一种方法如何实现这一点

就个人而言,我更喜欢在我的
UserViewModel
中创建一个
observefield
,创建getter和setter,如:

private final ObservableField<User> userField = new ObservableField<User>();

public UserViewModel(User user){
    userField.set(user);
}

public ObservableField<User> getUser(){
    return userField;
}
private final observefield userField=new observevefield();
公共用户视图模型(用户){
userField.set(用户);
}
公共observeField getUser(){
返回用户字段;
}
将其传递到布局并参照如下属性:

<variable
    name="userViewModel"
    type="your.package.UserViewModel" />

<EditText
    android:text"@={userViewModel.user.name}" />

每当您的用户在您的
编辑文本中更改其
名称
,这些更改也会在您的模型中更新。(使用带有
@={}
的双向数据绑定)


更新为使用
observefield
,感谢您的提醒,@tynn。如果我还是错的话,请纠正我

据我所知,这个问题与firebase更相关,对吗?当
user
发生更改时,您如何从firebase获得通知。这是正确的吗?你有没有试着用
@={viewModel.name}
处理你这里的所有东西?@GeorgeMount它与Firebase没有特别的关系。它可以是一个RxJava调用或任何将带有更新信息的{{User}}对象返回给本地对象的东西。我从服务器上获得的信息只需在模型中直接更改,在这种情况下,我需要更新UI。据我所知,这与firebase更相关,对吗?当
user
发生更改时,您如何从firebase获得通知。这是正确的吗?你有没有试着用
@={viewModel.name}
处理你这里的所有东西?@GeorgeMount它与Firebase没有特别的关系。它可以是一个RxJava调用或任何将带有更新信息的{{User}}对象返回给本地对象的东西。我从服务器获得的信息只需在模型中直接更改,在这种情况下,我需要的是更新UI。为什么要使用
observefield
?此处未使用其任何属性。。。。什么?我想我不明白你的意思。我使用android(本机)数据绑定库中的
ObservableField
,以避免创建可观察对象。请查看生成的绑定类。通过这种方式,您可以使用
UserViewModel
作为POJO,绑定使用