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,也许业务需求会不同,但是示例代码的实现方式是没问题的