无法过滤 PagedList?

Posted

技术标签:

【中文标题】无法过滤 PagedList?【英文标题】:Could not filter a PagedList? 【发布时间】:2018-05-21 05:35:45 【问题描述】:

我已经使用 android 的分页库 (https://developer.android.com/topic/libraries/architecture/paging.html) 实现了一个带有分页功能的 recyclerview。它适用于获取数据和检索后续页面。但是,如何过滤 PagedList ?假设我有一个搜索小部件,我想搜索当前屏幕上的列表。 PagedList.filter() 返回 List 并且 PagedListAdapter.setList() 不会接受 List

【问题讨论】:

A PagedList is a List. 更多信息:***.com/questions/49192540/… 您好,您有实现此目的的代码示例吗? 我在***.com/a/57851259/3146806回答了类似的问题 【参考方案1】:

我认为您可以使用 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) 
                // ...
            
        

【讨论】:

请注明原作者:***.com/a/49193372/1866373

以上是关于无法过滤 PagedList?的主要内容,如果未能解决你的问题,请参考以下文章

EF 利用PagedList进行分页并结合查询 方法2

PagedList.MVC 应用

C# PagedList 真分页

PagedList 安装

PagedList.Config 使用recycleview在中间加载列表

Spring boot Jackson Json Serialization for List 实现类(PagedList)