当前,我们在Room SQLite中存储了一个名为Todo
的数据结构>
我们当前的工作流程如下
DataSource.Factory<Integer, Todo>
LivePagedListBuilder
将DataSource.Factory<Integer, Todo>
变成LiveData<PagedList<Todo>>
LiveData<PagedList<Todo>>
,并使用submitList
将PagedList<Todo>
传递给PagedListAdapter<Todo, TodoAdapter.ViewHolder>
到目前为止,对于这种简单的用例来说都是如此。
但是,目前,我们对UI的要求更加复杂。我们需要先将Todo
转换为TransformedTodo
,然后再将submitList
转换为PagedListAdapter
。
这是我们的变换功能。
List<TransformedTodo> transform(Todo todo)
注意,可以将1
Todo
转换为1或多个TransformedTodo
。
我最初计划的工作流程是
DataSource.Factory<Integer, Todo>
DataSource.Factory.mapByPage
将DataSource.Factory<Integer, Todo>
转换为DataSource.Factory<Integer, TransformedTodo>
LivePagedListBuilder
将DataSource.Factory<Integer, TransformedTodo>
变成LiveData<PagedList<TransformedTodo>>
LiveData<PagedList<TransformedTodo>>
,并使用submitList
将PagedList<TransformedTodo>
传递给PagedListAdapter<TransformedTodo, TodoAdapter.ViewHolder>
棘手的部分是步骤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
TL; DR