通知模型更新的ViewModel?

时间:2016-11-06 21:31:22

标签: 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; }
    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被分配了相应的用户实例。

到目前为止,非常好:给定一个用户列表,其项目将通过RecyclerView呈现到UserViewModel

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

现在问题是:如何通知UserViewModel数据已更改,是否需要重新绘制用户界面中的相应视图?

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

感谢任何帮助和示例代码!谢谢! :)

2 个答案:

答案 0 :(得分:3)

您不需要使用Activity扩展UserViewModel,但您可以。我将展示如何实现这一目标的另一种方式。

就我个人而言,我更喜欢在BaseObservable中创建ObservableField<User>,创建getter和setter,如:

UserViewModel

将其传递给布局并引用如下属性:

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

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

public ObservableField<User> getUser(){
    return userField;
}

每当您的用户更改<variable name="userViewModel" type="your.package.UserViewModel" /> <EditText android:text"@={userViewModel.user.name}" /> 中的Name时,您的模型中的更改也会更新。 (使用EditText的双向数据绑定)

更新后使用@={},感谢您的提醒,@ ttynn。纠正我,如果我还是错的话。

答案 1 :(得分:1)

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