我有一個<Map<A, List<B >>來自 Room Database 的 LiveData,我還有一個 searchQuery,我想通過它來過濾 B 物件。例如,
data class Server(
val serverId: Int
)
data class Group(
val serverId: Int,
val groupId: Int,
val description: String
)
LiveData<Map<Server, List<Group>>
So I have
Server(100)
Group(100, 1, "AAAA")
Group(100, 2, "AAAB")
Group(100, 3, "AABB")
Server(200)
Group(200, 1, "AAAA")
Group(200, 2, "AAAB")
Group(200, 3, "AABB")
現在,我有一個searchableString = "BB"
所以我希望它在描述欄位中過濾的 LiveData,結果必須是
Server(100)
Group(100, 3, "AABB")
Server(200)
Group(200, 3, "AABB")
有沒有辦法在 Kotlin 上做到這一點?
uj5u.com熱心網友回復:
首先撰寫一個擴展函式來過濾你的地圖:
fun Map<Server, List<Group>>.filterGroups(descFilter: String) = mapValues { _, groups ->
groups.filter { descFilter in it.description }
}
如果要消除空服務器,可以.filter { _, groups -> groups.isNotEmpty() }在上述函式的末尾添加 a。
假設您的 LiveData 在視圖模型中,我將為搜索詞創建一個私有的 MutableLiveData 并使用公共屬性來更改它。然后用于switchMap根據您的輸入生成最終結果。
val sourceMapFromRoom: LiveData<Map<Server, List<Group>> = //...
private val _searchFilter = MutableLiveData<String>("")
val searchFilter: String
get() = _searchFilter.value
set(value) { _searchFilter.value = value }
val filteredMap = _searchFilter.switchMap { searchString ->
sourceMapFromRoom.map { it.filterGroups(searchString) }
}
switchMapflatMapLatest是Rx 或 Kotlin Flows 中的 LiveData 等價物。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/520772.html
標籤:安卓科特林安卓实时数据
