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