Item.kt 类是
@Entity(tableName = "item")
class Item(
val id: Long,
val title: String,
) {
@Ignore
var selection: Boolean = false
}
然后我进行查询以获取表中的所有项目,并返回
LiveData<List<Item>>
然后在viewModel中,我想对 Mutablelivedata selectionId 应用选择(真)协定,选择ID包含MutableLiveData<Long>
(它包含一个ID) 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实现这一目标。请帮助我
答案 0 :(得分:1)
我不了解您代码中的所有内容,例如,我从未见过名为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,然后可以保留该对象,而无需副本。