分页库:如何将PagedList转换为另一个具有不同大小的PagedList?

问题描述 投票:1回答:1

当前,我们在Room SQLite中存储了一个名为Todo的数据结构>

我们当前的工作流程如下

  1. Dao返回DataSource.Factory<Integer, Todo>
  2. 使用LivePagedListBuilderDataSource.Factory<Integer, Todo>变成LiveData<PagedList<Todo>>
  3. 观察LiveData<PagedList<Todo>>,并使用submitListPagedList<Todo>传递给PagedListAdapter<Todo, TodoAdapter.ViewHolder>

  4. 到目前为止,对于这种简单的用例来说都是如此。

但是,目前,我们对UI的要求更加复杂。我们需要先将Todo转换为TransformedTodo,然后再将submitList转换为PagedListAdapter

这是我们的变换功能。

List<TransformedTodo> transform(Todo todo)

注意,可以将1 Todo转换为1或多个TransformedTodo

我最初计划的工作流程是

  1. Dao返回DataSource.Factory<Integer, Todo>
  2. 使用DataSource.Factory.mapByPageDataSource.Factory<Integer, Todo>转换为DataSource.Factory<Integer, TransformedTodo>
  3. 使用LivePagedListBuilderDataSource.Factory<Integer, TransformedTodo>变成LiveData<PagedList<TransformedTodo>>
  4. 观察LiveData<PagedList<TransformedTodo>>,并使用submitListPagedList<TransformedTodo>传递给PagedListAdapter<TransformedTodo, TodoAdapter.ViewHolder>

  5. 棘手的部分是步骤2。

如果转换函数正在返回其大小与输入List<TransformedTodo>不同的输出List<Todo>,则将引发异常。

todosDataSourceFactory.mapByPage(new Function<List<Todo>, List<TransformedTodo>>() {
    @Override
    public List<TransformedTodo> apply(List<Todo> input) {
        // Exception will be thrown if we are returning a List where its size is different from input.
    }
});

抛出的异常看起来像

java.lang.IllegalStateException:无效的函数 com.yocto.wetodo.repository.TodoRepository$1@17b6f1b更改了收益 尺寸。不支持此功能。

这是为什么

// androidx.paging.DataSource

static <A, B> List<B> convert(Function<List<A>, List<B>> function, List<A> source) {
    List<B> dest = function.apply(source);
    if (dest.size() != source.size()) {
        throw new IllegalStateException("Invalid Function " + function
                + " changed return size. This is not supported.");
    }
    return dest;
}

似乎是对分页库的限制。是否可以将PagedList转换为另一个具有不同大小的PagedList


参考链接:

https://issuetracker.google.com/issues/142890117

How to use AAC paging library with list size different than list size returned by Room database

[当前,我们在Room SQLite中存储了一个名为Todo的数据结构。我们当前的工作流程如下:Dao返回DataSource.Factory 使用LivePagedListBuilder打开...

android android-architecture-components android-paging
1个回答
0
投票

TL; DR

© www.soinside.com 2019 - 2024. All rights reserved.