Skip to main content

AndroidのPagingのCodelabをやってみたので学んだことをまとめる

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() }
    )

関連記事:

Pocket