LivedPagedListで件数が0件のときの挙動を制御する

Paging libraryを使ってNetworkからdataをfetchする時、fetchは成功しているが件数が0件をどう検知するかにちょっと悩んだのでメモ。

viewModel

  imageData = LivePagedListBuilder(factory, config).build()

fragment

viewModel.imageData.observe(this, Observer{
  Timber.d("imageData is observed")
})

こんなコード書く時(DataSourceは略)

imageDataはfetchが成功した時、失敗した時どちらもobservedされる。imageDataのsizeを見て0件の時の挙動を制御しようとしても、fetchが成功したけど件数は0件の状態とfetchが失敗した状態なのかが判別つかない。

そこでBoundaryCallbackを使って解決する

viewModel

imageData = LivePagedListBuilder(factory, config).setBoundaryCallback(object : PagedList.BoundaryCallback<MessageImage>() {
            override fun onZeroItemsLoaded() {
                super.onZeroItemsLoaded()
                Timber.d("onZeroItemsLoaded")
            }

            override fun onItemAtEndLoaded(itemAtEnd: MessageImage) {
                super.onItemAtEndLoaded(itemAtEnd)
                Timber.d("onItemAtEndLoaded")
            }

            override fun onItemAtFrontLoaded(itemAtFront: MessageImage) {
                super.onItemAtFrontLoaded(itemAtFront)
                Timber.d("onItemAtFrontLoaded")
            }
        }).build()

fragmen

viewModel.imageData.observe(this,Observer{
  Timber.d("imageData is observed")
})

実行結果は以下の通り

fetch成功&件数がある

imageData is observed
onItemAtFrontLoaded

fetch成功&件数が0件

imageData is observed
onZeroItemsLoaded()

fetch失敗

imageData is observed

件数が0件の時は onZeroItemsLoaded() を利用できるのでこのcallbackを用いて0件時の挙動を定義してあげるとよさそう。