bac*_*uba 5 android android-recyclerview android-room android-livedata android-architecture-lifecycle
我正在开发基于架构组件(ViewModel/Room/Livedata)和 RecyclerView 的库存应用程序。该应用程序基于 Google 在开发人员培训书中推荐的实践。
高级 Android 开发课程 - 使用架构组件:Room、LiveData、ViewModel
该应用程序具有相当复杂的数据模型,它实现为 Room 实体和关系(10 多个表、外键等)。我也有相应的 DAO。
主要活动是要使用的项目列表的 RecyclerView,当用户单击其中一个项目时,会打开一个特殊的子活动,用户必须输入保存到 Room 中的项目相关数据。由于 LiveData,用户返回到刷新的 MainActivity 数据。由于 ViewModel,配置更改也起作用。
该应用程序的工作流程如下:
我想要的是过滤 MainActivity 的 RecyclerView 上的项目列表。
Google 和 Stackowerflow 的帖子推荐使用 Livedata 的 switchmap 进行过滤。
最佳实践:使用 Room 和 LiveData 的运行时过滤器
Android Room LiveData 选择查询参数
我不喜欢这种方法,因为
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);
}
Run Code Online (Sandbox Code Playgroud)FilterDataPOJO在哪里。
相反,我必须写
@Transaction
@Query("select * ...")
public abstract LiveData<List<ComplexData>> getFilteredComplexData(filterField1, filterField2, ...);
Run Code Online (Sandbox Code Playgroud)
我的计划如下
当 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)在 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();
}Run Code Online (Sandbox Code Playgroud)因此,将所有数据保存在 LiveData 中,当用户过滤器然后用过滤列表填充 RecyclerView 的适配器并通知更改时。
这样过滤正确吗?它有什么陷阱吗?
| 归档时间: |
|
| 查看次数: |
1635 次 |
| 最近记录: |