前人未踏の領域へ Androidアプリ開発編

Androidアプリ開発に関する調査メモ置き場。古い記事にはアプリ以外も含まれます。

Android: Fragment内のComposeでスクロール位置を復元する

追記

新しい記事を書いたのでこちらをご参考ください。 takerpg.hatenablog.jp

内容

Fragment内に ComposeVIew を作成し、LazyColumn でリストを表示したが、画面遷移から戻るとスクロール位置が元に戻ってしまう。 どうすればよいか。

TODO

まず、ComposeView.setViewCompositionStrategy を使ってComposableが破棄されるタイミングをViewのライフサイクルに合わせる

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {

    return ComposeView(context).apply {
            setViewCompositionStrategy(
                ViewCompositionStrategy.DisposeOnLifecycleDestroyed(viewLifecycleOwner)
            )
    }
}

次に、rememberLazyListState で保持させておいたスクロール位置情報をもとに LaunchedEffect内で復元する。

@Composable
fun ListScreen(){

    val listState = rememberLazyListState()

    // スクロール位置を復元
    LaunchedEffect(true) {
        listState.scrollToItem(
            listState.firstVisibleItemIndex,
            listState.firstVisibleItemScrollOffset
        )
    }

    LazyColumn(state = listState) {}
}

setViewCompositionStrategyだけではデータは保持されるが復元されなかったので自分で記述が必要だった。 上記とは異なるスクロール方式、あるいは他の状態の復元であっても基本的にやることは同じかと。

参考

developer.android.com

stackoverflow.com