web-dev-qa-db-ja.com

PagedListをフィルタリングできませんでしたか?

Androidのページングライブラリ( https://developer.Android.com/topic/libraries/architecture/paging.html )を使用してページングを使用してrecyclerviewを実装しました。データのフェッチと後続のページの取得で正常に機能します。ただし、PagedListをフィルタリングする方法は?検索ウィジェットがあり、現在画面に表示されているリストを検索するとします。 PagedList.filter()Listを返し、PagedListAdapter.setList()Listを受け入れません。

13
Jacky Coolheart

MediatorLiveDataでこれを解決できるかもしれないと思います。

具体的には、Transformations.switchMapといくつかの追加の魔法。

現在使用していた

public void reloadTasks() {
    if(liveResults != null) {
        liveResults.removeObserver(this);
    }
    liveResults = getFilteredResults();
    liveResults.observeForever(this);
}

しかし、考えてみれば、observeForeverを使用せずにこれを解決できるはずです。特に、switchMapも同様のことをしていると考える場合はそうです。

したがって、必要なのは、必要なLiveDataにスイッチマップされたLiveDataです。

private MutableLiveData<String> filterText = new MutableLiveData<>();

private final LiveData<List<T>> data;

public MyViewModel() {
    data = Transformations.switchMap(
            filterText,
            (input) -> { 
                if(input == null || input.equals("")) { 
                    return repository.getData(); 
                } else { 
                    return repository.getFilteredData(input); }
                }
            });
  }

  public LiveData<List<T>> getData() {
      return data;
  }

このように、あるものから別のものへの実際の変更は、MediatorLiveDataによって処理されます。 LiveDataをキャッシュする場合は、メソッドに渡す匿名インスタンスで行うことができます。

data = Transformations.switchMap(
        filterText, new Function<String, LiveData<List<T>>>() {
            private Map<String, LiveData<List<T>>> cachedLiveData = new HashMap<>();

            @Override
            public LiveData<List<T>> apply(String input) {
                // ...
            }
        }
1
Alireza aslami