我最近在我的一个项目上切换到Android MVVM,我面临的问题是,当我的片段与ViewPager和TabLayout一起使用时,每个选项卡的数据必须根据每个选项卡的ID而不同,但是由于我使用AndroidViewModel连接到我的数据源,因此所有选项卡中都显示了相同的数据。我知道问题是所有动态片段之间共享相同的视图模型[Fragmnet 类是相同的]。 有什么办法吗?或者如果我做错了什么。
返回数据的代码
private MutableLiveData<List<InventoryProduct>> inventoryProductList;
//we will call this method to get the data
public LiveData<List<InventoryProduct>> getCategoriesList(String cat_id,String store_id) {
//if the list is null
if (inventoryProductList == null) {
inventoryProductList = new MutableLiveData<>();
//we will load it asynchronously from server in this method
loadInventoryProducts(cat_id,store_id);
}
//finally we will return the list
return inventoryProductList;
}
对多个片段使用相同的 ViewModel 并没有错,事实上,它在很多方面都有帮助。在您的情况下,我建议在片段中保留一些标识符,您可以将其传递给 ViewModel 的函数,并相应地决定提供哪些数据。这样,不同的片段将具有不同的数据,并且只要生命周期所有者还活着,您的数据仍将是持久的。 根据编辑的问题,您将需要删除空检查,因为正在使用相同的 ViewModel 实例,一旦初始化,inventoryProductList 将永远不会再为空,因此后续函数将获取第一个片段的数据。作为解决方案(如果您不想走DB方式(,您可以像这样维护LiveData的映射
Map<CatId/StoreId,LiveData<List<InventoryProduct>>> dataMap=new HashMap();
现在,您不是空检查,而是检查映射中的 CatId/StoryID(基于您已经使用的键(,如果 Map 还没有该值,请进行 API 调用,否则从映射返回值。
像这样的东西 假设您使用了 StoreID 作为键
if(!dataMap.containsKey(store_id)){
MutableLiveData<List<InventoryProduct>> inventoryProductList = new MutableLiveData<>();
//we will load it asynchronously from server in this method
loadInventoryProducts(cat_id,store_id);
dataMap.put(store_id,inventoryProductList);
//You need to post the response from the api call in this inventoryProductList
}
return dataMap.get(store_id);
确保在获得相应 cat_id/store_id 的 API 响应后,实际将数据发布到相应的 LiveData。