1、Paging库是什么?
答:paging库是android Jetpack组件之一,配合recyclerview使用,用于展示类似于list的数据。
2、paging库有什么优势?
答:目前我们使用recyclerview来展示view,数据源一般来源于网络或者数据库。那么当我们加载数据时,我们是如何确定要加载多少的呢?当首次加载的数据使用完后,我们是不是都有一个上拉加载更多的交互逻辑?如果这个数据阈值设置得过小,用户每滑动几下,就需要等待再次加载,如果阈值设置得过大,又浪费了内存和带宽资源。
而paging库,就能很好地解决这个问题:你只需要设置一个相对比之前小的阈值,paging库在用户滑动即将达到阈值时就会去加载更多,使我们代码编码起来会更简单,不用处理什么时候需要上拉加载的问题。
3、怎么使用paging库?
答:
- 引入paging gradle依赖。
dependencies {
def paging_version = "1.0.0"
implementation "android.arch.paging:runtime:$paging_version"
// alternatively - without Android dependencies for testing
testImplementation "android.arch.paging:common:$paging_version"
// optional - RxJava support
implementation "android.arch.paging:rxjava2:$paging_version"
}
2、新建一个Adapter继承PagedListAdapter。
继承PagedListAdapter和继承普通的RecyclerviewAdapter有什么区别呢?PagedListAdapter的构造函数多一个参数:DiffUtil.ItemCallback.这个参数是属于DiffUtil的,很早就有了,用来判断recyclerview中某一个item的数据是否有变化,是否需要更新的。除此之外,我们新建的adapter没有其他任何区别。
protected PagedListAdapter(@NonNull DiffUtil.ItemCallback<T> diffCallback) {
mDiffer = new AsyncPagedListDiffer<>(this, diffCallback);
mDiffer.mListener = mListener;
}
3、当adapter需要更新数据时,不要去调用adapter.notifyDatasetChanged(),而应该调用pageadapter.submitList(PagedList pagedList),summitlist的好处是,当更新数据时,会按需更新,而不是无脑地全量更新,这样更节省性能。
因为我们需要调用submitList(),而该方法只接收PagedList参数,那么我们怎么来构建这个pagedList是我们使用paging库时需要着重考虑的。
如下图所示,采用倒推的方法来分析当我们使用paging库时,应该如何去构造准备数据。
因为room数据本身已经支持了通过Dao声明,直接构建Datasource,所以如果数据来源是数据库,那么采用room数据库,就可以极其方便地结合paging库使用了。
我个人demo其实只是官方demo的简化版,建议先看建议demo,弄清主流程后,再看官方demo,去理解学习google的设计方法,譬如:"加载失败后重试"这个操作,要是给我们写,肯定是在界面上弄一个重新加载的按钮,然后呢,绑定一个重新加载的监听,但是google就不是这样做的,google具体是怎样优雅实现的,就留给读者自己去发现了~~