如何在数据绑定库中收到通知?

how to be notified in view in Databinding library?

您好,我的问题是我的 activity 正在监听 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");
    }

}

和我的视图模型:

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);
    }

}

UI 已更新但未调用回调。我想要回调加上 UI 更新。 我想知道数据绑定库是这样工作的!有像 Rxjava 这样的库,但我不想导入它。

您是否希望在拨打 setUser 时收到回调?因为那不是它的工作方式。 setUser 在绑定视图上显式设置数据模型视图。如果您更改任何数据模型属性的值超出此点,将调用 属性 更改回调。将您的代码更改为此,我想您会收到回调 -

User user = new User("sa");
binding.setUser(user);
user.setName("Johny Depp");   //you should receive the callback beyond this and the UI would update too

编辑 - class 实现 Observable 接口将允许绑定将单个侦听器附加到绑定对象以侦听该对象上所有属性的更改。

Observable 接口具有添加和删除侦听器的机制,但通知由开发人员决定。为了方便开发,创建了一个基础class,BaseObservable,实现监听器注册机制。数据 class 实现者仍然负责在属性更改时通知。这是通过将 Bindable 注释分配给 getter 并在 setter.

中通知来完成的

当你这样做时:

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");

您应该会收到一条关于您提供的回调的通知,并且应该会在您致电 binding.setUser(user) 时收到。查找 ActivityMainBinding.java,您将在应用的构建文件夹中看到为 class 生成的代码。在 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");

任何实现 Observable 接口的东西都将支持任意数量的侦听器,因此您可以随意侦听事件。