android – 分页库过滤/搜索
作者:互联网
我正在使用Android Paging Library,如下所述:
https://developer.android.com/topic/libraries/architecture/paging.html
但我也有一个EditText用于按名称搜索用户.
如何过滤分页库中的结果以仅显示匹配的用户?
解决方法:
从2019年编辑:坚持,我想你可以用MediatorLiveData来解决这个问题.
特别是Transformations.switchMap和一些额外的魔法.
目前我正在使用
public void reloadTasks() {
if(liveResults != null) {
liveResults.removeObserver(this);
}
liveResults = getFilteredResults();
liveResults.observeForever(this);
}
但是如果你考虑一下,你应该能够在不使用observeForever的情况下解决这个问题,特别是如果我们认为switchMap也在做类似的事情.
所以我们需要的是一个LiveData< SelectedOption>切换映射到LiveData< PagedList< T>>我们需要的.
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处理.如果我们想要缓存LiveDatas,那么我们可以在传递给方法的匿名实例中执行.
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) {
// ...
}
}
原始答案(它们已经过时)
编辑:实际上.虽然这对于使用Paging的常规LiveData<?>来说是有意义的,但您实际上可以参数化Factory,然后使数据源无效并获得免费评估的新数据源.无需重新创建查询持有者本身.
因此,当您使用Paging时,另一个答案中提到的方法是更好的选择.
原始答案:
您知道如何使用这样的适配器:
public class TaskAdapter
extends PagedListAdapter<Task, TaskAdapter.ViewHolder> {
public TaskAdapter() {
super(Task.DIFF_ITEM_CALLBACK);
}
在ViewModel中,您可以设置实时分页列表并公开它:
private LiveData<PagedList<Task>> liveResults;
public TaskViewModel() {
liveResults = new LivePagedListBuilder<>(taskDao.tasksSortedByDate(),
new PagedList.Config.Builder() //
.setPageSize(20) //
.setPrefetchDistance(20) //
.setEnablePlaceholders(true) //
.build())
.setInitialLoadKey(0)
.build();
然后,您在ViewModel中观察分页列表并将其设置为适配器:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
viewModel.getTasks().observe(this, pagedList -> {
//noinspection Convert2MethodRef
taskAdapter.submitList(pagedList); //used to be `setList`
});
好吧,棘手的是,如果你想让它参数化,那么你必须在这里替换以下内容,并使视图能够观察它:
liveResults = new LivePagedListBuilder<>(userDao.usersByName(input) // <-- !!
所以你必须更换LiveData. O_O
在这种情况下,您可以执行的操作是从现有LiveData中删除观察者,将其替换为新的LiveData,然后开始观察它.
private void startListening() {
viewModel.getTasks().observe(this, pagedList -> {
//noinspection Convert2MethodRef
taskAdapter.submitList(pagedList); // used to be `setList`
});
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
startListening();
}
@OnTextChanged(R.id.edit_text)
public void onTextChanged(Editable editable) {
String username = editable.toString();
replaceSubscription(userName);
}
private void replaceSubscription(String userName) {
viewModel.replaceSubscription(this, userName);
startListening();
}
和
public class UserViewModel extends ViewModel {
private LiveData<PagedList<User>> liveResults;
private String userName;
private LiveData<PagedList<User>> createFilteredUsers(String userName) {
// TODO: handle if `null` and load all data instead
return new LivePagedListBuilder<>(userDao.usersByName(userName),
new PagedList.Config.Builder() //
.setPageSize(20) //
.setPrefetchDistance(20) //
.setEnablePlaceholders(true) //
.build())
.setInitialLoadKey(0)
.build();
}
public UserViewModel(UserDao userDao, @Nullable String userName) { // null or restored, from ViewModelProviders.of(Factory)
liveResults = createFilteredUsers(userName);
}
public void replaceSubscription(LifecycleOwner lifecycleOwner, String userName) {
this.userName = userName;
liveResults.removeObservers(lifecycleOwner);
liveResults = createFilteredUsers(userName);
}
}
标签:android,search,android-paging 来源: https://codeday.me/bug/20191003/1851111.html