我正在使用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
进行选择。
但是,如果我直接在DummyClass中调用函数onImageCaptured
并设置属性ProfilImage
,则更改数据源的选择将不再起作用。
到目前为止,我发现它必须是呼叫notifyPropertyChanged(BR.profileImage)
。如果我将其注释掉,则其他绑定仍然有效。但是,“ notifyPropertyChanged”是必需的
以便正确更新视图并显示新的个人资料图片。
有人知道为什么notifyPropertyChanged
会破坏另一个观察者吗?还是我做错了什么?