Android Mutablelivedata 列表项未通知更改

Android Mutablelivedata list item didn't notify changed

我这样声明变量。

var saleData: MutableLiveData<SaleData> = MutableLiveData()

数据class

data class SaleData(
    var saleType: Int,
    var saleDetail: Int,
    var salePrice: Int,
    var saleRate: Int,
    var printAmount: Int
)

然后,初始化数据

init {
 saleData.value = SaleData(saleType = 1, saleDetail = 0, salePrice = 0, saleRate = 0, printAmount = 1)
}

问题是,如果 SaleData 中数据 class 的其中一个组成部分发生变化,我可以得到通知吗? 我简单的写了下面的代码,但是没有结果值。

viewModel

fun changeData() {
    saleData.value?.saleRate = 50
}

片段 - 在 onCreateView

binding.viewModel = viewModel
binding.lifecycleOwner = this
viewModel.saleData.observe(viewLifecycleOwner, Observer { saleData ->
    Log.d(TAG,"value changed")
})

更改 saleData 中的 saleRate 时无法获取日志

喜欢这个代码,

saleData.value = SaleData(saleType = saleType, saleDetail = 0, salePrice = 0, saleRate = 0, printAmount = 1)

我设置了 saleData 值,它通知值已更改,但我想在更改 saleData 项目时通知更改

我还需要设置什么吗?

saleData.value?.saleRate = 50 的调用不会通知观察者,因为存储在 MutableLiveData 中的底层对象保持不变。为了 LiveData 通知它的观察者,你需要给它分配一个新的对象。 假设 SaleData 是一个数据 class,你可以通过调用

让它通知它的观察者

saleData.value = saleData.value?.copy(saleRate = 50)

这将通知所有注册的观察员。

Rafsanjani所述,您需要将 SaleData class 的更新引用分配给 LiveData。完成后,LiveData 观察器将通知更改。为了更好地理解,请参阅下面的代码。

SaleDataViewModel

class SaleDataViewModel: ViewModel() {
   private var _saleData: MutableLiveData<SaleData> = MutableLiveData()
   val saleData: LiveData<SaleData> = _saleData

   init {
      _saleData.value = SaleData(saleType = 1, saleDetail = 0, salePrice = 0, saleRate = 0, printAmount = 1)
   }

   fun updateSale() {
      val saleRate = updatedSaleRate()
      _saleData.value = SaleData( _saleData.value!!.saleType, _saleData.value!!.saleDetail, _saleData.value!!.salePrice, saleRate, _saleData.value!!.printAmount)
   }

   private fun updatedSaleRate(): Int {
      return 50
   }
}

SaleDataFragment

class SaleDataFragment: Fragment() {
   ...
   override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
     super.onViewCreated(view, savedInstanceState) {
     viewModel.updateSale()
     viewModel.saleData.observe(viewLifecycleOwner, Observer {
         Log.d(TAG, "Notify change")
     })
  }
}