Update ReorderingLazyList accordingly to LazyList
This commit is contained in:
@@ -34,6 +34,7 @@ import androidx.compose.foundation.lazy.rememberLazyListSemanticState
|
|||||||
import androidx.compose.foundation.overscroll
|
import androidx.compose.foundation.overscroll
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
import androidx.compose.runtime.snapshots.Snapshot
|
import androidx.compose.runtime.snapshots.Snapshot
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
@@ -63,16 +64,19 @@ internal fun ReorderingLazyList(
|
|||||||
) {
|
) {
|
||||||
val overscrollEffect = ScrollableDefaults.overscrollEffect()
|
val overscrollEffect = ScrollableDefaults.overscrollEffect()
|
||||||
val itemProvider = rememberLazyListItemProvider(reorderingState.lazyListState, content)
|
val itemProvider = rememberLazyListItemProvider(reorderingState.lazyListState, content)
|
||||||
|
val semanticState =
|
||||||
|
rememberLazyListSemanticState(reorderingState.lazyListState, itemProvider, reverseLayout, isVertical)
|
||||||
|
val beyondBoundsInfo = reorderingState.lazyListBeyondBoundsInfo
|
||||||
|
val scope = rememberCoroutineScope()
|
||||||
val placementAnimator = remember(reorderingState.lazyListState, isVertical) {
|
val placementAnimator = remember(reorderingState.lazyListState, isVertical) {
|
||||||
LazyListItemPlacementAnimator(reorderingState.coroutineScope, isVertical).also {
|
LazyListItemPlacementAnimator(scope, isVertical)
|
||||||
reorderingState.lazyListState.placementAnimator = it
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
reorderingState.lazyListState.placementAnimator = placementAnimator
|
||||||
|
|
||||||
val measurePolicy = rememberLazyListMeasurePolicy(
|
val measurePolicy = rememberLazyListMeasurePolicy(
|
||||||
itemProvider,
|
itemProvider,
|
||||||
reorderingState.lazyListState,
|
reorderingState.lazyListState,
|
||||||
reorderingState.lazyListBeyondBoundsInfo,
|
beyondBoundsInfo,
|
||||||
overscrollEffect,
|
overscrollEffect,
|
||||||
contentPadding,
|
contentPadding,
|
||||||
reverseLayout,
|
reverseLayout,
|
||||||
@@ -84,13 +88,6 @@ internal fun ReorderingLazyList(
|
|||||||
placementAnimator
|
placementAnimator
|
||||||
)
|
)
|
||||||
|
|
||||||
val semanticState = rememberLazyListSemanticState(
|
|
||||||
reorderingState.lazyListState,
|
|
||||||
itemProvider,
|
|
||||||
reverseLayout,
|
|
||||||
isVertical
|
|
||||||
)
|
|
||||||
|
|
||||||
val orientation = if (isVertical) Orientation.Vertical else Orientation.Horizontal
|
val orientation = if (isVertical) Orientation.Vertical else Orientation.Horizontal
|
||||||
LazyLayout(
|
LazyLayout(
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
@@ -103,15 +100,8 @@ internal fun ReorderingLazyList(
|
|||||||
userScrollEnabled = userScrollEnabled
|
userScrollEnabled = userScrollEnabled
|
||||||
)
|
)
|
||||||
.clipScrollableContainer(orientation)
|
.clipScrollableContainer(orientation)
|
||||||
.lazyListBeyondBoundsModifier(
|
.lazyListBeyondBoundsModifier(reorderingState.lazyListState, beyondBoundsInfo, reverseLayout)
|
||||||
state = reorderingState.lazyListState,
|
.lazyListPinningModifier(reorderingState.lazyListState, beyondBoundsInfo)
|
||||||
beyondBoundsInfo = reorderingState.lazyListBeyondBoundsInfo,
|
|
||||||
reverseLayout = reverseLayout
|
|
||||||
)
|
|
||||||
.lazyListPinningModifier(
|
|
||||||
state = reorderingState.lazyListState,
|
|
||||||
beyondBoundsInfo = reorderingState.lazyListBeyondBoundsInfo
|
|
||||||
)
|
|
||||||
.overscroll(overscrollEffect)
|
.overscroll(overscrollEffect)
|
||||||
.scrollable(
|
.scrollable(
|
||||||
orientation = orientation,
|
orientation = orientation,
|
||||||
@@ -166,12 +156,10 @@ private fun rememberLazyListMeasurePolicy(
|
|||||||
if (isVertical) Orientation.Vertical else Orientation.Horizontal
|
if (isVertical) Orientation.Vertical else Orientation.Horizontal
|
||||||
)
|
)
|
||||||
|
|
||||||
// resolve content paddings
|
|
||||||
val startPadding =
|
val startPadding =
|
||||||
if (isVertical) {
|
if (isVertical) {
|
||||||
contentPadding.calculateLeftPadding(layoutDirection).roundToPx()
|
contentPadding.calculateLeftPadding(layoutDirection).roundToPx()
|
||||||
} else {
|
} else {
|
||||||
// in horizontal configuration, padding is reversed by placeRelative
|
|
||||||
contentPadding.calculateStartPadding(layoutDirection).roundToPx()
|
contentPadding.calculateStartPadding(layoutDirection).roundToPx()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,7 +167,6 @@ private fun rememberLazyListMeasurePolicy(
|
|||||||
if (isVertical) {
|
if (isVertical) {
|
||||||
contentPadding.calculateRightPadding(layoutDirection).roundToPx()
|
contentPadding.calculateRightPadding(layoutDirection).roundToPx()
|
||||||
} else {
|
} else {
|
||||||
// in horizontal configuration, padding is reversed by placeRelative
|
|
||||||
contentPadding.calculateEndPadding(layoutDirection).roundToPx()
|
contentPadding.calculateEndPadding(layoutDirection).roundToPx()
|
||||||
}
|
}
|
||||||
val topPadding = contentPadding.calculateTopPadding().roundToPx()
|
val topPadding = contentPadding.calculateTopPadding().roundToPx()
|
||||||
@@ -191,18 +178,14 @@ private fun rememberLazyListMeasurePolicy(
|
|||||||
isVertical && !reverseLayout -> topPadding
|
isVertical && !reverseLayout -> topPadding
|
||||||
isVertical && reverseLayout -> bottomPadding
|
isVertical && reverseLayout -> bottomPadding
|
||||||
!isVertical && !reverseLayout -> startPadding
|
!isVertical && !reverseLayout -> startPadding
|
||||||
else -> endPadding // !isVertical && reverseLayout
|
else -> endPadding
|
||||||
}
|
}
|
||||||
val afterContentPadding = totalMainAxisPadding - beforeContentPadding
|
val afterContentPadding = totalMainAxisPadding - beforeContentPadding
|
||||||
val contentConstraints =
|
val contentConstraints =
|
||||||
containerConstraints.offset(-totalHorizontalPadding, -totalVerticalPadding)
|
containerConstraints.offset(-totalHorizontalPadding, -totalVerticalPadding)
|
||||||
|
|
||||||
state.updateScrollPositionIfTheFirstItemWasMoved(itemProvider)
|
|
||||||
|
|
||||||
// Update the state's cached Density
|
|
||||||
state.density = this
|
state.density = this
|
||||||
|
|
||||||
// this will update the scope used by the item composables
|
|
||||||
itemProvider.itemScope.setMaxSize(
|
itemProvider.itemScope.setMaxSize(
|
||||||
width = contentConstraints.maxWidth,
|
width = contentConstraints.maxWidth,
|
||||||
height = contentConstraints.maxHeight
|
height = contentConstraints.maxHeight
|
||||||
@@ -217,7 +200,6 @@ private fun rememberLazyListMeasurePolicy(
|
|||||||
|
|
||||||
val itemsCount = itemProvider.itemCount
|
val itemsCount = itemProvider.itemCount
|
||||||
|
|
||||||
// can be negative if the content padding is larger than the max size from constraints
|
|
||||||
val mainAxisAvailableSize = if (isVertical) {
|
val mainAxisAvailableSize = if (isVertical) {
|
||||||
containerConstraints.maxHeight - totalVerticalPadding
|
containerConstraints.maxHeight - totalVerticalPadding
|
||||||
} else {
|
} else {
|
||||||
@@ -226,9 +208,6 @@ private fun rememberLazyListMeasurePolicy(
|
|||||||
val visualItemOffset = if (!reverseLayout || mainAxisAvailableSize > 0) {
|
val visualItemOffset = if (!reverseLayout || mainAxisAvailableSize > 0) {
|
||||||
IntOffset(startPadding, topPadding)
|
IntOffset(startPadding, topPadding)
|
||||||
} else {
|
} else {
|
||||||
// When layout is reversed and paddings together take >100% of the available space,
|
|
||||||
// layout size is coerced to 0 when positioning. To take that space into account,
|
|
||||||
// we offset start padding by negative space between paddings.
|
|
||||||
IntOffset(
|
IntOffset(
|
||||||
if (isVertical) startPadding else startPadding + mainAxisAvailableSize,
|
if (isVertical) startPadding else startPadding + mainAxisAvailableSize,
|
||||||
if (isVertical) topPadding + mainAxisAvailableSize else topPadding
|
if (isVertical) topPadding + mainAxisAvailableSize else topPadding
|
||||||
@@ -241,8 +220,6 @@ private fun rememberLazyListMeasurePolicy(
|
|||||||
itemProvider,
|
itemProvider,
|
||||||
this
|
this
|
||||||
) { index, key, placeables ->
|
) { index, key, placeables ->
|
||||||
// we add spaceBetweenItems as an extra spacing for all items apart from the last one so
|
|
||||||
// the lazy list measuring logic will take it into account.
|
|
||||||
val spacing = if (index.value == itemsCount - 1) 0 else spaceBetweenItems
|
val spacing = if (index.value == itemsCount - 1) 0 else spaceBetweenItems
|
||||||
LazyMeasuredItem(
|
LazyMeasuredItem(
|
||||||
index = index.value,
|
index = index.value,
|
||||||
|
|||||||
Reference in New Issue
Block a user