我目前正在开发一款使用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
模型数据更新的问题。
感谢任何帮助和示例代码!谢谢! :)
答案 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,您可以通知您的列表。