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件時の挙動を定義してあげるとよさそう。