xml数据绑定在notifyPropertyChanged后中断

时间:2018-12-17 15:52:38

标签: android xml mvvm data-binding

我正在使用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会破坏另一个观察者吗?还是我做错了什么?

0 个答案:

没有答案
相关问题