我正在开发基于架构组件(ViewModel/Room/Livedata)和 RecyclerView 的库存应用程序。该应用基于 Google 在开发人员培训书中推荐的做法。
高级 Android 开发课程 - 使用架构组件:Room、LiveData、ViewModel
该应用程序具有相当复杂的数据模型,它实现为 Room 实体和关系(10 多个表、外键等)。我也有相应的 DAO。
主要活动是要使用的项目列表的 RecyclerView,当用户单击其中一个项目时,会打开一个特殊的子活动,用户必须输入保存到房间中的项目相关数据。当用户返回到由于 LiveData 刷新的 MainActivity 数据时。由于 ViewModel,配置更改也有效。
应用程序的工作流程如下:
- 用户从服务器下载数据,创建 Room DB,MainActivity 显示要使用的项目列表
- 用户浏览项目,单击其中一个,打开一个特定于项目的子活动,用户在其中记录其保存到 Room 中的数据
- 当所有物品完成用户将物品记录数据上传到服务器时,房间中的数据被删除,用户可以下载新的物品列表
- 用户不能删除或插入新项目,他只能将其数据记录在相应的子活动中。下载数据时删除/插入的项目。
我想要的是过滤 MainActivity 的 RecyclerView 上的项目列表。
Google 和 Stackowerflow 的帖子推荐使用 Livedata 的 switchmap 进行过滤。
最佳实践:使用 Room 和 LiveData
Android Room LiveData 选择查询参数的运行时过滤器
我不喜欢这种方法,因为
- 我必须去 Room 并在新的 AsyncTask 中查询数据
Room 不提供基于复杂过滤器模型的综合查询
public abstract class DAO { @Transaction @Query("select * " + "from table1 t1 " + "join table2 t2 on t2.field = t1.field " + "join table3 t3 on t3.field = t2.field " + ... "join tablen tn on tn.field = t(n-1).field " + "where t1.filterField = filterData.filterField1 " + and t2.filterField = filterData.filterField2 " + ... and tm.filterField = filterData.filterFieldm") public abstract LiveData<List<ComplexData>> getFilteredComplexData(FilterData filterData); }
FilterData
POJO在哪里。
相反,我必须写
@Transaction
@Query("select * ...")
public abstract LiveData<List<ComplexData>> getFilteredComplexData(filterField1, filterField2, ...);
我的计划如下
- 用户在FilterActivity中指定FilterData
当 FilterActivity 完成时
protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == INTENT_REQUEST_FILTER) { if (resultCode == RESULT_OK) { FilterData filterData = (FilterData)data.getParcelableExtra(INTENT_MESSAGE_FILTER_DATA)); RecyclerviewAdapter.setComplexData(ViewModel.getComplexData().getValue(), filterData); } } }
在 RecyclerView 的适配器中
void setComplexData(List<ComplexData> complexData, FilterData filterData) { if (filterData != null) { List<ComplexData> = complexData. stream(). filter(do filterData.filter1 here). filter(do filterData.filter2 here). ... filter(do filterData.filterm here). collect(Collectors.toList()); } else { List<ComplexData> = complexData; } notifyDataSetChanged(); }
因此,将所有数据保留在 LiveData 中,当用户过滤时,然后用过滤列表填充 RecyclerView 的适配器并通知更改。
以这种方式过滤是否正确?它有什么陷阱吗?