Jetpack Compose LazyColumn的滑动开始、结束及进行中事件

910 阅读1分钟

Jetpack Compose LazyColumn的滑动开始、结束及进行中事件

有个需求是列表滚动后去调主页的原生View控件通知动画,而LazyColumn本身没有提供onScroll之类的方法
其实是写法不一样,借助rememberLazyListState,可以判断LazyColumn的滑动状态,详见注释:

@Composable
fun SomeWidget() {
    val listState = rememberLazyListState()
    if (listState.isScrollInProgress) {
        LaunchedEffect(Unit){
            //只会调用一次,相当于滚动开始
        }
        //当state处于滚动时,preScrollStartOffset会被初始化并记忆,不会再被更改
        val preScrollStartOffset by remember { mutableStateOf(listState.firstVisibleItemScrollOffset) }
        val preItemIndex by remember { mutableStateOf(listState.firstVisibleItemIndex) }
        val isScrollDown = if (listState.firstVisibleItemIndex > preItemIndex) {
            //第一个可见item的index大于开始滚动时第一个可见item的index,说明往下滚动了
            true
        } else if (listState.firstVisibleItemIndex < preItemIndex) {
            //第一个可见item的index小于开始滚动时第一个可见item的index,说明往上滚动了
            false
        } else {
            //第一个可见item的index等于开始滚动时第一个可见item的index,对比item offset
            listState.firstVisibleItemScrollOffset > preScrollStartOffset
        }

        DisposableEffect(Unit) {
            onDispose {
                //当dispose时说明list不再处于滚动状态,刚好是滚动结束
                //onScroll Done
            }
        }
    }
    LazyColumn(state = listState) {
       //...
    }

}

preScrollStartOffset的作用是利用remember,记录刚开始滚动时的状态,用以对比之后的状态做出判断 因为有remember所以直到isScrollInProgress为false之前,开始滑动时的初始状态都不会被"遗忘"
具体处理方式可以实践一下打打log,也许业务需求会不同,但是示例代码的实现方式是没问题的