![](/img/trans.png)
[英]Android - dynamically change a list with an edittext error - LiveData + Room + ViewModel
[英]Android - Filter LiveData List based on Selected Item change in ViewModel
我的其中一個片段有一個 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,然后我通過.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()
但是正如您可能會也可能不會猜到的那樣,它不會在selectedTeam
更改時更新allPlayers
的過濾器。
無論如何,每當selectedTeam
發生變化時,是否可以動態更改allPlayers
的過濾器?
編輯
感謝@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()
}
您需要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
}
我真的希望它能像我直接在這里寫的那樣工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.