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()
っていうのがいてよくある、リストを一番上まで一気にスクロールさせるようなものも簡単に実装できそうです。