我的 Fragment 中有一个带有 AAC 的 RecyclerView。 ViewModel --> Repository --> DAO 带有一些自定义查询和 getAllItems。
我想使用 Filter FAB 或 Spinner 来调用 getOrderItemList 或 getWhereItemList 查询,但我不知道该怎么做。
我的 SearchView 有一个存储库过滤器,但这是另一回事,现在我想更改列表顺序(按字母顺序、年份...)并创建一个WhereCondition,其中包含我在对话框中的许多复选框(例如:我选中“完成”和“操作”复选框并创建字符串 whereCondition =“(status = 'complete' 和流派如 '%Action%')")。
如何从我的 Fragment 调用 getWhereItemList 和 getOrderItemList 查询来更改我的 RecyclerView 内容?
ItemDAO:
@Query("SELECT * from item_table ")
<List<Item>> getItemList();
@Query("SELECT * from item_table ORDER by :order DESC")
<List<Item>> getOrderItemList(String order);
@Query("SELECT * from item_table WHERE :whereCondition")
<List<Item>> getWhereItemList(String whereCondition);
我的片段用 getAllItems 填充 RecyclerView:
private ItemViewModel myItemViewModel;
RecyclerView myRecyclerView = findViewById(R.id.recyclerview);
final ItemListAdapter myAdapter = new ItemListAdapter(this);
myRecyclerView.setAdapter(myAdapter);
myRecyclerView.setLayoutManager(new LinearLayoutManager(this));
myItemViewModel = ViewModelProviders.of(this).get(ItemViewModel.class);
myItemViewModel.getAllItems().observe(this, new Observer<List<Item>>() {
@Override
public void onChanged(@Nullable final List<Item> items) {
myAdapter.setItems(items);
}
项目列表适配器:
private List<Item> myItems;
void setItems(List<Item> items){
myItems = items;
notifyDataSetChanged();
}
项目 View 模型:
private ItemRepository myRepository;
private LiveData<List<Item>> myAllItems;
public ItemViewModel (Application application) {
super(application);
myRepository = new ItemRepository(application);
myAllItems = myRepository.getAllItems();
}
LiveData<List<Item>> getAllItems() { return myAllItems; }
谢谢。
最佳答案
这个想法是有两个 LiveData
实例:
- 跟踪当前过滤器类型的过滤器。您可以设置其初始值。
- 发出
List<Item>
的信号。这也应该对其他LiveData
使用react改变并获得新的List<Item>
如果需要的话。
您可以使用Transformations.SwitchMap实现LiveData2
。它的作用是返回 LiveData
可以切换到不同源以响应另一个 LiveData
的实例对象。
项目 View 模型:
private ItemRepository myRepository;
/**
* Keep track of the current filter type.
* In this example the initial value is set to Filter.ALL, which
* represents the non-filtered list.
*/
private MutableLiveData<Filter> itemFilter = new MutableLiveData<>(Filter.ALL);
/**
* Emits list of items
*/
private LiveData<List<Item>> myItems = Transformations.switchMap(itemFilter, filter -> {
// Everytime itemFilter emits a new value, this piece of code
// will be invoked. You are responsible for returning the
// LiveData instance according to the filter value.
switch(filter.type) {
case ALL:
return myRepository.getAllItems();
case ORDER_BY:
return myRepository.getOrderItemList(filter.query);
case WHERE:
return myRepository.getWhereItemList(filter.query);
}
});
public ItemViewModel (Application application) {
super(application);
myRepository = new ItemRepository(application);
}
public LiveData<List<Item>> getItems() { return myItems; }
/**
* View should call this method in order to switch to different
* filter.
*/
public void changeFilter(Filter itemFilter) {
this.itemFilter.setValue(filter);
}
定义此自定义过滤器类:
public class Filter {
public enum Type {
ALL,
ORDER_BY,
WHERE
}
final public Type type;
final public String query;
public Filter(Type type, String query) {
this.type = type;
this.query = query;
}
}
关于android-recyclerview - 如何使用另一个 Room-DAO 查询刷新我的 RecyclerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55904386/