0
Help us understand the problem. What are the problem?

posted at

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?