gpt4 book ai didi

Android - 根据 ViewModel 中的选定项目更改过滤 LiveData 列表

转载 作者:行者123 更新时间:2023-12-03 22:20:51 25 4
gpt4 key购买 nike

我的其中一个 fragment 有一个 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()

...
}
注: getAllTeamsgetAllPlayers返回一个 RxJava Flowable List,然后我通过 .toLiveData 将其转换为 LiveData List
目前, 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) 的函数正如函数指定的那样,它从一个团队中获取所有玩家。
最后这是我的属性(property)的最终结果:
val allPlayersFromSelectedTeam: LiveData<List<Player>>
get() = selectedTeam.switchMap {
repository
.getAllPlayersFromTeam(it)
.toLiveData()
}

最佳答案

您需要 switchMap超过 selectedTeam ,并可能重命名为“allPlayers”,因为那是谎言。 :P

val selectedTeam = MutableLiveData<Team>()

val allTeams: LiveData<List<Team>>
get() = repository.getAllTeams().toLiveData()

val playersOfSelectedTeam: LiveData<List<Player>>
get() = Transformations.switchMap(selectedTeam) { team ->
val allPlayers = repository.getAllPlayers().toLiveData()
val players = when {
team == null -> allPlayers
else -> {
Transformations.switchMap(allPlayers) { playerList ->
val filteredPlayers = MutableLiveData<List<Player>>()
val filteredList = playerList.filter { player -> player.team == team }
filteredPlayers.value = filteredList
filteredPlayers
}
}
}
players
}

我真的希望它能像我直接在这里写的那样工作。

关于Android - 根据 ViewModel 中的选定项目更改过滤 LiveData 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53994960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com