Как обновить мой RecyclerView с помощью другого Room-DAO Query - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть RecyclerView с AAC в моем фрагменте.ViewModel -> Repository -> DAO с некоторыми пользовательскими запросами и getAllItems.

Я хочу использовать FAB-фильтр или Spinner для вызова запросов getOrderItemList или getWhereItemList, но я не знаю, как я должен это делать.

У меня есть фильтр репозитория для моего SearchView, но это другая вещь, теперь я хочу изменить порядок списка (в алфавитном порядке, год ...) и создать WhereCondition с большим количеством флажков, которые есть в диалоге(пример: я устанавливаю флажок «завершить» и «Действие» и создает строку String whereCondition = "(status = 'complete' и жанр похож на '% Action%')").

Как я могу вызвать 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);

Мой фрагмент заполняет RecyclerView с помощью getAllItems:

   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);
       }  

ItemListAdapter:

private List<Item> myItems;

void setItems(List<Item> items){
   myItems = items;
   notifyDataSetChanged();
 }

ItemViewModel:

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; }

Спасибо.

1 Ответ

0 голосов
/ 30 апреля 2019

Идея состоит в том, чтобы иметь два LiveData экземпляра:

  • тот, который отслеживает текущий тип фильтра. Вы можете установить его начальное значение.
  • тот, который излучает List<Item>. Это также должно отреагировать на другое LiveData изменение и получить новое List<Item> при необходимости.

Вы можете использовать Transformations.SwitchMap для реализации LiveData2. Он в основном возвращает экземпляр LiveData, который может переключиться на другой источник в ответ на другой объект LiveData.

ItemViewModel:

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;
    }
}
...