android-recyclerview - 如何使用另一个 Room-DAO 查询刷新我的 RecyclerView

标签 android-recyclerview android-room android-viewmodel

我的 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/

相关文章:

android - RecyclerView 消失的图片

android - 当屏幕上没有足够的项目时调用无尽的 recyclerview 滚动监听器

android - 房间内完全一对一的关系

android - Kotlin:不可变类型对可变类型的内部变量的只读访问

android - Kotlin 协程等待 2 个或更多不同的并发请求

android - 在 Android 中使用 Firebase 在 RecyclerView 上获取 onClickListener

android - 从 firebase 获取最新的帖子/数据,在 android 中限制 10 条记录并填充到 Listview 中

android - 如何在模块中添加 View 模型?

android - 组合两个具有相同观察者类型的 LiveData 对象

java - 向实体添加新字段