簡體   English   中英

Android - 根據 ViewModel 中的 Selected Item 更改過濾 LiveData 列表

[英]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()

    ...
}

注意: 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()

但是正如您可能會也可能不會猜到的那樣,它不會在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()
    }

您需要switchMapselectedTeam ,並可能改名為“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM