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具體是怎樣優雅實現的,就留給讀者自己去發現了~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章