问题描述
问题-向下滚动会导致底部的工作表滚动,而不是为LazyColumn提供滚动优先级(RecclerView没有此问题。它由NestedScrollView包装)我刚刚介绍了一个组成LazyColumn的替换,它替换了一个协调员Layout中的回收器。协调器(作为底页实现)本身可以在PEEK和展开状态之间自由滚动。我的问题是,当在LazyColumn中向下拖动Items区域时,底部的工作表会选择滚动,而不是LazyColumn。如果我先在LazyColumn上向上滚动,然后向下滚动(没有松开),则LazyColumn会拾取滚动,并向LazyColumn赋予滚动优先级(预期行为)。
BottomSheetFragment
|-CoordinatorLayout
|--ConstraintLayout (BottomSheetBehavior)
|---MyListFragment
|----ComposeView
|-----Theme
|------Surface
|-------Box
|--------LazyColumn
新作曲,所以我希望有人能告诉我如何更正这个新的滚动行为?
**编辑我通过切换协调员的^^BottomSheetBehavior.isDragglable来实现这一点,但它确实需要我释放拖拽,而不是平稳地从列表滚动到底部工作表滚动-有人建议解决方法吗?:
fun MyUi(listener:Listener) {
val listState = rememberLazyListState()
LaunchedEffect(listState) {
listState.interactionSource.interactions.collect {
//at the top of the list so allow sheet scrolling
listener.allowSheetDrag(listState.firstVisibleItemScrollOffset == 0)
}
}
val nestedScrollConnection = remember {
object : NestedScrollConnection {
override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
Timber.i("NestedScrollConnection onPreScroll($available: Offset, $source: NestedScrollSource)")
return super.onPreScroll(available, source)
}
override fun onPostScroll(consumed: Offset, available: Offset, source: NestedScrollSource): Offset {
Timber.i("NestedScrollConnection onPostScroll($consumed: Offset, $available: Offset, $source: NestedScrollSource)")
if (available.y > 0.0 && consumed.y == 0.0f) {
//scolling down up but we're already at the top - kick over to sheet scrolling
listener.allowSheetDrag(true)
}
return super.onPostScroll(consumed, available, source)
}
}
}
Box(
modifier = Modifier
.fillMaxSize()
.nestedScroll(nestedScrollConnection)
) {
LazyColumn(
modifier =
Modifier
.fillMaxSize()
.padding(vertical = 12.dp), state = listState
) {
item {
Row() {}
}
}
}
}
然后在片段中:
override fun allowSheetDrag(allowSheetDrag: Boolean) {
bottomSheetFragment?.bottomSheetBehavior?.isDraggable = allowSheetDrag
}
推荐答案
向导Chris Banes最近发布了一个解决方法,我可以确认它是有效的:https://gist.github.com/chrisbanes/053189c31302269656c1979edf418310
在BottomSheetDialog
(向上滚动,然后一次向下拖动工作表)中使用时,无需抬起手指,它也可以很好地过渡
示例用法(摘自Chris Banes的示例):
setContent {
Surface(
// Add this somewhere near the top of your layout, above any scrolling layouts
modifier = Modifier.nestedScroll(rememberViewInteropNestedScrollConnection())
) {
LazyColumn() {
// blah
}
}
}
跟踪使用ComposeView进行嵌套滚动的问题:https://issuetracker.google.com/issues/174348612,以及将我引向此处的相关SO问题:AndroidView in Compose loses touch events in NestedScrollView
这篇关于通过ComposeView互操作在协调员Layout内合成LazyColumn滚动行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!