如何使用 MediatorLiveData 更改 LiveData<List<T>>(在我的例子中是 LiveData<List<Item>>)中 class 的特定 属性 值
How to change particular property value of a class in a LiveData<List<T>> (in my case LiveData<List<Item>>) using MediatorLiveData
-
android-livedata
-
android-viewmodel
-
android-architecture-components
-
mutablelivedata
-
kotlin-coroutines
Item.ktclass就是
@Entity(tableName = "item")
class Item(
val id: Long,
val title: String,
) {
@Ignore
var selection: Boolean = false
}
然后我进行查询以获取 table 中的所有项目,它 return
LiveData<List<Item>>
然后在 viewModel 中,我想将 selection(true) accordig 应用到 Mutablelivedata selectionId, selection id contain MutableLiveData<Long>
(it contain an id in the LiveData<List<Item>>
)
MyViewModel.kt代码如下所示
class MyViewModel(val repository: Repository) : ViewModel() {
..........
......
val selectionId: MutableLiveData<Long> by lazy {
MutableLiveData<Long>()
}
fun setSelectionId(id: Long) {
selectionId.postValue(id)
}
..........
......
val itemLiveList: LiveData<List<Item>> = liveData(Dispatchers.IO) {
emitSource(repository.getItems())
}
}
如果是 List<Item>
我可以这样做
val ItemWithSelection: List<Item> = repository.getItems().apply {
this.forEach {
if (it.id == selectionId) {
it.selection = true
}
}
}
但我不知道如何使用 Mediator LiveData 实现此目的。请帮助我
我不理解你代码中的所有内容,例如我从未见过名为 liveData(CoroutineDispatcher)
的函数。但是你是说你想要这样的东西吗?
val listWithoutSelection = liveData(Dispatchers.IO) {
emitSource(repository.getItems())
}
val listWithSelection = MediatorLiveData<List<Item>>().apply {
addSource(listWithoutSelection) { updateListSelection() }
addSource(selectionId) { updateListSelection() }
}
fun updateListSelection() {
listWithSelection.value = listWithoutSelection.value?.map {
if (it.id == selectionId.value)
it.copyWithSelection(true)
else
it
}
}
使用 Kotlin 数据可以轻松完成 copyWithSelection 类。不需要取决于您是否要修改从数据库中获取的对象。如果您只在此处使用该对象,您可以始终将其他对象的选择重置为 false,然后您可以保留该对象而无需副本。
android-livedata
android-viewmodel
android-architecture-components
mutablelivedata
kotlin-coroutines
Item.ktclass就是
@Entity(tableName = "item")
class Item(
val id: Long,
val title: String,
) {
@Ignore
var selection: Boolean = false
}
然后我进行查询以获取 table 中的所有项目,它 return
LiveData<List<Item>>
然后在 viewModel 中,我想将 selection(true) accordig 应用到 Mutablelivedata selectionId, selection id contain MutableLiveData<Long>
(it contain an id in the LiveData<List<Item>>
)
MyViewModel.kt代码如下所示
class MyViewModel(val repository: Repository) : ViewModel() {
..........
......
val selectionId: MutableLiveData<Long> by lazy {
MutableLiveData<Long>()
}
fun setSelectionId(id: Long) {
selectionId.postValue(id)
}
..........
......
val itemLiveList: LiveData<List<Item>> = liveData(Dispatchers.IO) {
emitSource(repository.getItems())
}
}
如果是 List<Item>
我可以这样做
val ItemWithSelection: List<Item> = repository.getItems().apply {
this.forEach {
if (it.id == selectionId) {
it.selection = true
}
}
}
但我不知道如何使用 Mediator LiveData 实现此目的。请帮助我
我不理解你代码中的所有内容,例如我从未见过名为 liveData(CoroutineDispatcher)
的函数。但是你是说你想要这样的东西吗?
val listWithoutSelection = liveData(Dispatchers.IO) {
emitSource(repository.getItems())
}
val listWithSelection = MediatorLiveData<List<Item>>().apply {
addSource(listWithoutSelection) { updateListSelection() }
addSource(selectionId) { updateListSelection() }
}
fun updateListSelection() {
listWithSelection.value = listWithoutSelection.value?.map {
if (it.id == selectionId.value)
it.copyWithSelection(true)
else
it
}
}
使用 Kotlin 数据可以轻松完成 copyWithSelection 类。不需要取决于您是否要修改从数据库中获取的对象。如果您只在此处使用该对象,您可以始终将其他对象的选择重置为 false,然后您可以保留该对象而无需副本。