我目前正在开发一个使用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/