使用 livedata 和 ViewModel 根据现有数据查找数据
Posted
技术标签:
【中文标题】使用 livedata 和 ViewModel 根据现有数据查找数据【英文标题】:Finding data based on existing data using livedata and ViewModel 【发布时间】:2022-01-07 00:40:57 【问题描述】:我有一个 ViewModel,在 ViewModel 中我调用 api 来获取数据,
在getLeaguesBySeasons
方法中,我得到了我想要的数据并将其推送到LiveData
,但现在我想根据该数据执行搜索功能,所以在onFilterLeague
方法中我该怎么做,在这里谁能帮我解决这个问题。
以下是我的 ViewModel 中的代码:
class ChooseLeagueViewModel @Inject constructor(
private val api: RemoteRepositoryImpl,
private val database: LocalRepositoryImpl
) :
BaseViewModel()
private var _leaguesSelected = mutableListOf<Response>()
val events: LiveData<Event<String>>
get() = _events
private val _events = MutableLiveData<Event<String>>()
private val _response = MutableLiveData<Resource<List<Response>>>()
val response: LiveData<Resource<List<Response>>> = _response
fun getLeaguesBySeasons()
viewModelScope.launch(Dispatchers.IO)
_response.postValue(Resource.loading(null))
try
val response = api.getLeaguesBySeasons(2021)
val list = response.response
list?.let
_response.postValue(Resource.success(it))
catch (e: Exception)
e.printStackTrace()
_response.postValue(Resource.error(e.toString(), null))
fun onFilterLeague(query: String)
非常感谢。
【问题讨论】:
您可以过滤_response
实时数据中的数据并将其存储在新的实时数据中。这将使_response
成为 ViewModel 的真实来源,并将新的实时数据作为视图的真实来源。
【参考方案1】:
您的实时数据对象(在本例中为 _response)将包含最后“推送”的数据。所以调用 _response.value 会给你当前的价值。请注意,在后台线程上调用此方法并不能保证会收到最新的值集。
从此时起,您可以对最新数据使用过滤器、查找、映射或任何其他您需要的功能,并将其推送到您的观察者应该做出反应的最新实时数据结果,以便更新 UI。
【讨论】:
你的意思是这样的代码:``` fun onFilterLeague(query: String) _response.map var datas = it.data datas?.filter item -> query == item.联赛?.name ``` _response.value.map ....your code to do your filters/sorting/whatever 重要的是“_response.value”从您的实时数据对象中获取最新值。以上是关于使用 livedata 和 ViewModel 根据现有数据查找数据的主要内容,如果未能解决你的问题,请参考以下文章
JetpackLiveData 架构组件 ( LiveData 简介 | LiveData 使用方法 | ViewModel + LiveData 示例 )
JetpackLiveData 架构组件 ( LiveData 简介 | LiveData 使用方法 | ViewModel + LiveData 示例 )