如何在数据绑定库中获得通知?

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 这样的库,但我不喜欢导入它。

Geo*_*unt 5

当你这样做时:

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接口的东西都将支持任意数量的侦听器,因此您可以随意侦听事件。