2017-02-05 13 views
0

Привет, моя проблема в том, что мои действия, прослушивающие viewmodel, изменяются, но обратный вызов не вызван!Как получить уведомление в библиотеке Databinding?

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

} 

и мой ViewModel:

общественного класс User расширяет 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 обновляется, но обратный вызов не дозвонился. Я хочу иметь обратный вызов плюс обновление пользовательского интерфейса. Я хочу знать, что библиотека связывания данных работает так! для этого есть библиотеки, такие как Rxjava, но я не люблю импортировать их.

+0

Да никогда не называли – David

ответ

2

Когда вы сделаете это:

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 и вы увидите код, сгенерированный для класса в папке сборки приложения. В методе setUser() вы увидите вызов notifyPropertyChanged(BR.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 будет поддерживать любое количество слушателей, так что вы можете чувствовать себя свободно прослушивать события.

+0

Спасибо, Джордж за ваш ответ. хорошо объясненный – David

1

Ожидаете ли вы получить обратный вызов, когда звоните 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 

Edit - Класса реализации Observable интерфейса позволит переплету прикрепить один слушатель к связанному объекту для прослушивания изменений все свойства этого объекта.

Интерфейс Observable имеет механизм для добавления и удаления слушателей, но уведомление зависит от разработчика. Чтобы упростить разработку, был создан базовый класс BaseObservable для реализации механизма регистрации слушателя. Разработчик класса данных по-прежнему несет ответственность за уведомление при изменении свойств. Это делается путем назначения аннотации Bindable для получателя и уведомления в сеттере.

+0

не очень, 'addOnPropertyChangedCallback' вызывается' ActivityMainBinding' объекта (ActivityMainBinding связывания), так что 'onPropertyChanged' будет только после того, как называется' binding.setUser (...) ' – pskink

+0

SRY, но есть OnClick слушателя для кнопки. но когда я нажимаю кнопки обновления пользовательского интерфейса, но onPropertyChanged не вызывается. Из «Наблюдаемого интерфейса» можно привязать привязку к одному слушателю, «вы не хотите, чтобы другой слушатель не мог подключиться к слушателю, кроме одного? и пользовательский интерфейс - это ОДИН? – David

+0

@pskink Я обновил свой код, и это как и предыдущий. u проверил его? – David

 Смежные вопросы

  • Нет связанных вопросов^_^