Android Jetpack系列04之Paging

1、Paging库是什么?

答:paging库是android Jetpack组件之一,配合recyclerview使用,用于展示类似于list的数据。

2、paging库有什么优势?

答:目前我们使用recyclerview来展示view,数据源一般来源于网络或者数据库。那么当我们加载数据时,我们是如何确定要加载多少的呢?当首次加载的数据使用完后,我们是不是都有一个上拉加载更多的交互逻辑?如果这个数据阈值设置得过小,用户每滑动几下,就需要等待再次加载,如果阈值设置得过大,又浪费了内存和带宽资源。
而paging库,就能很好地解决这个问题:你只需要设置一个相对比之前小的阈值,paging库在用户滑动即将达到阈值时就会去加载更多,使我们代码编码起来会更简单,不用处理什么时候需要上拉加载的问题。

3、怎么使用paging库?

答:

  1. 引入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 地址:https://github.com/dongzhixuanyuan/JetPackDemo
官方demo:https://github.com/googlesamples/android-architecture-components/tree/master/PagingWithNetworkSample
我个人demo其实只是官方demo的简化版,建议先看建议demo,弄清主流程后,再看官方demo,去理解学习google的设计方法,譬如:"加载失败后重试"这个操作,要是给我们写,肯定是在界面上弄一个重新加载的按钮,然后呢,绑定一个重新加载的监听,但是google就不是这样做的,google具体是怎样优雅实现的,就留给读者自己去发现了~~

猜你喜欢

转载自blog.csdn.net/HelloMagina/article/details/85059841