使用 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 示例 )

使用 ViewModel 和 LiveData 多次改造执行 API

MVVM 架构,ViewModel和LiveData

MVVM 架构,ViewModel和LiveData

Android Jetpack 学习之旅--> ViewModel & LiveData 的使用