Я использую библиотеку привязки данных Android и у меня следующий сценарий
Мой класс выглядит примерно так:
class DummyClass : BaseModel() {
private var model: DummyModel? = null
private var profileImage: ImageModel? = null
@Bindable
fun getModel() : DummyModel? {
return model
}
fun setModel(model: DummyModel?) {
this.model = model
notifyPropertyChanged(BR.model)
}
@Bindable
fun getProfileImage() : ImageModel? {
return profileImage
}
fun setProfileImage(imageModel: ImageModel?) {
this.profileImage = imageModel
notifyPropertyChanged(BR.profileImage)
}
}
Моя ViewModel:
class MyViewModel(application: Application, id : Long) : BaseViewModel(application) {
private val mObservableDummy = MutableLiveData<DummyClass>()
private val mObservableManufacturers = MutableLiveData<List<ManufacturerModel>>()
private val mObservableManufacturer = MutableLiveData<ManufacturerModel>()
private val mObservableModels = MutableLiveData<List<DummyModel>>()
val dummy: LiveData<DummyClass>
get() = mObservableBike
val manufacturers: LiveData<List<ManufacturerModel>>
get() = mObservableManufacturers
val manufacturer: LiveData<ManufacturerModel>
get() = mObservableManufacturer
val models: LiveData<List<DummyModel>>
get() = mObservableModels
private fun loadModelsForManufacturer() {
val models = modelService.findModelsByManufacturerId(manufacturer.value?.manufacturerId ?: 0).sortedBy { it.name }
mObservableModels.value = models
}
/**
* Set the captured image as profile image
*/
fun onImageCaptured(bitmap: Bitmap) {
val newProfileImage = imageService.createImageModelByBitmap(bitmap)
dummy.value?.setProfileImage(newProfileImage)
}
}
И в моем макете у меня есть следующее xml DataBinding:
<my.custom.widgets.ClickToSelectEditText
android:id="@+id/txtInputModel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
bind:dataSource="@{viewModel.models}"
bind:selectedItem="@={ModelToListableConverter.convertModelToListable(viewModel.dummy.model)}"/>
Все это прекрасно работает.У меня в виджете ClickToSelectEditText
все модели на выбор, и с помощью функции loadModelsForManufacturer
выбор можно изменить.
Но если я вызову функцию onImageCaptured
и установлю свойство ProfilImage
непосредственно вмой DummyClass, изменение выбора для моего источника данных больше не будет работать.До сих пор я узнал, что это должен быть звонок notifyPropertyChanged(BR.profileImage)
.Если я закомментирую это, другая привязка все еще работает.«notifyPropertyChanged», однако, необходимо, чтобы представление обновлялось правильно и отображалось новое изображение профиля.
У кого-нибудь была идея, почему notifyPropertyChanged
может сломать другого наблюдателя?Или я что-то не так делаю?