Как изменить значение определенного свойства класса в LiveData <List <T>> (в моем случае LiveData <List <Item>>), используя MediatorLiveData - PullRequest
0 голосов
/ 02 июля 2019

Класс Item.kt равен

@Entity(tableName = "item")
class Item(
    val id: Long,
    val title: String,
    ) {
    @Ignore
    var selection: Boolean = false
}

Затем я делаю запрос, чтобы получить все элементы в таблице, он возвращает

LiveData<List<Item>>

Затем в viewModel я хочу применить selection (true) в соответствии с Mutablelivedata selectionId , идентификатор выбора содержит MutableLiveData<Long> (он содержит идентификатор в 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. Пожалуйста, помогите мне

1 Ответ

1 голос
/ 02 июля 2019

Я не все понимаю в вашем коде, например, я никогда не видел функцию с именем 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
    }
}

copyWithSelection можно легко сделать с помощью классов данных Kotlin.Это не требуется в зависимости от того, хотите ли вы изменить объект, который вы получаете из базы данных.Если вы используете этот объект только здесь, вы можете просто сбросить выбор других на false, а затем вы можете сохранить объект, и вам не нужна копия.

...