Dav*_*vid 2 android observer-pattern android-databinding
嗨,我的问题是我的活动侦听viewmodel字段更改但未调用回调!
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
binding.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
@Override
public void onPropertyChanged(Observable observable, int i) {
Log.d(getClass().getSimpleName(), "changed");
}
});
User user = new User("user");
binding.setUser(user);
user.setName("newUser");
}
}
Run Code Online (Sandbox Code Playgroud)
和我的视图模型:
public class User extends BaseObservable {
public String name;
public User(String name) {
this.name = name;
}
@Bindable
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
notifyPropertyChanged(BR.name);
}
}
Run Code Online (Sandbox Code Playgroud)
UI 已更新,但未调用回调。我想要一个回调加上 UI 更新。我想知道数据绑定库是这样工作的!有像 Rxjava 这样的库,但我不喜欢导入它。
当你这样做时:
ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
binding.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
@Override
public void onPropertyChanged(Observable observable, int i) {
Log.d(getClass().getSimpleName(), "changed");
}
});
User user = new User("user");
binding.setUser(user);
user.setName("newUser");
Run Code Online (Sandbox Code Playgroud)
您应该会收到有关您提供的回调的通知,并且在您调用 时应该会收到binding.setUser(user)。查找ActivityMainBinding.java,您将在应用程序的构建文件夹中看到为该类生成的代码。在该setUser()方法中,您将看到notifyPropertyChanged(BR.user)将调用您的侦听器的调用。
您看到的问题是您想要的数据更改(名称)发生在User而不是Binding 上。为了获得用户更改的通知,您必须添加这样的列表器:
ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
User user = new User("user");
user.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
@Override
public void onPropertyChanged(Observable observable, int i) {
Log.d(getClass().getSimpleName(), "changed");
}
});
binding.setUser(user);
user.setName("newUser");
Run Code Online (Sandbox Code Playgroud)
任何实现该Observable接口的东西都将支持任意数量的侦听器,因此您可以随意侦听事件。