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")
})
}
}
我这样声明变量。
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")
})
}
}