batchのブログ

知見の備忘録

Jetpack Composeでリストの最後を検知する

この記事は Jetpack Composeでリストの最後を検知する - Qiita のコピーです。

Jetpack Composeでリスト表示を作るとき、今までのRecyclerViewのようにリスト表示を作るとき、 LazyColumnというComposableメソッドを使うと思います。

この LazyColumnの引数には、 LazyListState型の stateを渡すことができ、これによって今リストのどのへんをスクロールしてるかなどの状態を参照したり、操作したりできるようになります。

そして本題のリストが最後のItemまでスクロールされたかどうかを検知する方法ですが、自分は今の所下記の方法で実装しています。

val listState = rememberLazyListState()
        LazyColumn(
            contentPadding = LocalWindowInsets.current.systemBars
                .toPaddingValues(top = false, start = false, end = false),
            state = listState
        ) {
                if (listState.firstVisibleItemIndex + listState.layoutInfo
                .visibleItemsInfo.size == listState.layoutInfo.totalItemsCount) {
                      // なにかする
                }
            }
        }

listState がリストの状態を持っている変数です。

listState.firstVisibleItemIndexが今画面に表示されている一番上のItemのindexを持っています。そして、listState.layoutInfo.visibleItemsInfo.sizeが今画面に表示されているItemの数を持っています。これを足した値が、 listState.layoutInfo.totalItemsCountである全体のリストの長さと同じになったときリストが一番最後までスクロールされた状態であることがわかります。

自分はこの方法でやっているのですが、もっとスマートなやり方がありそうなので詳しい方教えてくださると嬉しいです。

そのうち、デフォルトでリスナーみたいなのが LazyListStateから生えるといいな。。。。

ちなみに、 LazyListStateには listState.animateScrollToItem()っていうのがいてよくある、リストを一番上まで一気にスクロールさせるようなものも簡単に実装できそうです。