其他分享
首页 > 其他分享> > android – 分页库过滤/搜索

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