我目前正在开发一个使用Firebase的实时数据库和数据绑定(bind)进行显示的应用程序。为简单起见,这是问题的简单版本:

给定一个模型类:

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 /片段中,我有一个RecyclerView呈现用户列表。因此,在适配器的onCreateViewHolder()中,我使用DataBindingUtils扩展了布局,并创建了一个新的ViewHolder和一个访问UI的新的UserViewModel实例。在onBindViewHolder()中,UserViewModel被分配了相应的User实例。

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

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

现在开始问题:我如何通知UserViewModel数据已更改,并且需要重绘UI中的相应 View ?

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

任何帮助和示例代码表示赞赏!谢谢! :)

最佳答案

您不需要使用UserViewModel扩展BaseObservable,但是可以。我将展示另一种方式来实现此目的。

就个人而言,我更喜欢在自己的ObservableField<User>中创建一个UserViewModel,创建如下的getter和setter:

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时,更改也会在模型中更新。 (使用双向数据绑定(bind)与@={})

更新为使用ObservableField,感谢大家注意@tynn。如果我还是错的话,请纠正我。

关于android - 通知ViewModel模型更新?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40454767/

10-13 02:26