У меня есть AndroidViewModel для одного из моих фрагментов, который содержит список LiveData, и у меня есть другое свойство для выбранного элемента другого списка LiveData.Ниже приведен пример того, о чем я говорю:
class TeamViewModel(app: Application): AndroidViewMode(app) {
...
val selectedTeam = MutableLiveData<Team>()
val allTeams: LiveData<List<Team>>
get() = repository.getAllTeams().toLiveData()
val allPlayers: LiveData<List<Player>>
get() = repository.getAllPlayers().toLiveData()
...
}
Примечание: getAllTeams
и getAllPlayers
возвращают RxJava Flowable List, который я затем преобразовываю в LiveDataСписок через `.toLiveData
В настоящее время allPlayers
представляет всех игроков из всех команд.Я бы хотел, чтобы при изменении значения selectedTeam
значение allPlayers
отфильтровывалось для отображения только игроков с selectedTeam
.
. Я пытался фильтровать allPlayers
прямо так:
val allPlayers: LiveData<List<Player>>
get() = repository.getAllPlayers()
.flatMap { list -> Flowable.fromIterable(list)
.filter {
player -> player.team == selectedTeam.value?.team
}
}
.toList()
.toFlowable()
.toLiveData()
Но, как вы можете или не можете догадаться, он не обновляет фильтр для allPlayers
всякий раз, когда selectedTeam
изменяется.
Есть ли в любом случаединамически менять фильтр для allPlayers
всякий раз, когда selectedTeam
изменяется?
РЕДАКТИРОВАТЬ
Благодаря @EpicPandaForce, окончательное решение, которое я придумал, выглядит следующим образом:
Я создал этот метод расширения fun <T, R> LiveData<T>.switchMap(func: (T) -> LiveData<R>) = Transformations.switchMap(this, func)
, чтобы сделать код более читабельным.
Я также создал функцию в своем хранилище под названием getAllPlayersFromTeam(team: Team)
, которая, как указывает функция, получает всеигроки из команды.
Наконец, это конечный результат моей собственности:
val allPlayersFromSelectedTeam: LiveData<List<Player>>
get() = selectedTeam.switchMap {
repository
.getAllPlayersFromTeam(it)
.toLiveData()
}