Paging3のCodelabを試しにやってみた
ただ、これ使う必要本当にあるのかなぁ・・・って思った
・Flow
注: Flow に対して map や filter などの操作を実行する場合は、再度トリガーする必要がなくなるように、操作を実行した後に必ず cachedIn を呼び出してください。
Flowは複数の値を順次返す
https://developer.android.com/kotlin/flow?hl=ja
cachedinはスコープの間だけキャッシュしてくれるようになる
https://star-zero.medium.com/paging-3-%E3%81%AE%E5%A4%89%E6%9B%B4%E7%82%B9-d5ae93b9e68a
・Flow.collect
collectでデータを取得する
https://qiita.com/sudo5in5k/items/d116b5c1c54ba00944a5#flowtcollect
・PagingSource
デフォルトでは、初期ロードサイズは、ページサイズの 3 倍です。このように、Paging では、リストが最初に読み込まれるときには十分な項目が表示され、
読み込まれたページを越えてスクロールされなかった場合に、過度なネットワーク リクエストを行わないようにしています。
https://developer.android.com/topic/libraries/architecture/paging/v3-paged-data?hl=ja#pagingsource
anchorPosition
Most recently accessed index in the list, including placeholders.
closestPageToPosition // * prevKey == null -> anchorPage is the first page. // * nextKey == null -> anchorPage is the last page. // * both prevKey and nextKey null -> anchorPage is the initial page, so // just return null.
・PagingDataAdapter
状態を監視しリフレッシュをトリガーに動くようにする
loadStateFlow
A hot Flow of CombinedLoadStates that emits a snapshot whenever the loading state of the current PagingData changes.
adapter.loadStateFlow // Only emit when REFRESH LoadState changes. .distinctUntilChangedBy { it.refresh } // Only react to cases where REFRESH completes i.e., NotLoading. .filter { it.refresh is LoadState.NotLoading } .collect { binding.list.scrollToPosition(0) }
・ヘッダーとフッターの設定
adapter.withLoadStateHeaderAndFooter( header = ReposLoadStateAdapter { adapter.retry() }, footer = ReposLoadStateAdapter { adapter.retry() } )