Paging库是用来代替在ListView中查询的CursorAdapter和在RecyclerView中查询的AsyncListUtil的。
Paging库的主要组成:
DataSource
:定义数据来源,可以根据实际情况继承其子类:
PageKeyedDataSource
:使用当前Page保存的前后key来查找数据,例如使用当前保存的nextPage token。ItemKeyedDataSource
:使用当前项的数据获取下一项的数据,例如嵌套评论,使用前一项的id获取下一项的数据。PositionalDataSource
:从数据来源的任意点获取任意个数的数据。
Paging库可以搭配Room库使用,Room库可以帮我们自动生成能够获取PositionalDataSource实例的DataSource.Factory,例如:
@Query("select * from users WHERE age > :age order by name DESC, id ASC")
DataSource.Factory<Integer, User> usersOlderThan(int age);
PagedList
:从DataSource
中加载数据,可以设置一次加载多少数据,预加载多少数据。同时这个类也可以为其他类提醒更新,例如RecyclerView.Adapter
。PagedListAdapter
:这是一个RecyclerView.Adapter
的实现类,用来从PagedList
中获取数据。当加载了新页时,PagedListAdapter
可以提醒RecyclerView
进行更新。PagedListAdapter
使用子线程进行新旧页数据的对比,提高效率。实时更新:传入
DataSource.Factory
,生成对应的LiveData或者Flowable实现自动更新:LivePagedListBuilder
:LiveData<PagedList<Item>> pagedItems = LivePagedListBuilder(myDataSource, /* page size */ 50) .setFetchExecutor(myNetworkExecutor) .build();
RxPagedListBuilder
:Flowable<PagedList<Item>> pagedItems = RxPagedListBuilder(myDataSource, /* page size */ 50) .setFetchScheduler(myNetworkScheduler) .buildFlowable(BackpressureStrategy.LATEST);