Код: Выделить всё
data class GridItem(val id: Int, val text: String)
@Composable
fun ReorderableGridViewScreen(modifier: Modifier = Modifier) {
var items by remember { mutableStateOf(List(10) { GridItem(it,"Item $it") }) }
val lazyGridState = rememberLazyGridState()
val reorderableLazyGridState = rememberReorderableLazyGridState(lazyGridState) { from, to ->
items = items.toMutableList().apply {
add(to.index, removeAt(from.index))
}
}
Column(
modifier = modifier
.fillMaxSize()
.background(Color.LightGray)
.padding(16.dp)
) {
Text(
text = "Reorderable Grid View",
style = MaterialTheme.typography.headlineLarge,
modifier = Modifier.padding(bottom = 16.dp)
)
LazyVerticalGrid(
columns = GridCells.Fixed(2), // 2 columns
state = lazyGridState,
modifier = Modifier.fillMaxSize(),
contentPadding = PaddingValues(8.dp),
verticalArrangement = Arrangement.spacedBy(8.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp),
) {
items(items, key = { it.id }) { item ->
ReorderableItem(reorderableLazyGridState, key = item.id) { isDragging ->
val elevation by animateDpAsState(if (isDragging) 4.dp else 0.dp)
Surface(shadowElevation = elevation) {
Box(
modifier = Modifier
.fillMaxSize()
.background(Color.White)
.padding(8.dp),
contentAlignment = Alignment.Center
) {
Text(text = item.text, style = MaterialTheme.typography.bodyMedium)
IconButton(
onClick = {},
modifier = Modifier
.align(Alignment.BottomEnd)
.draggableHandle()
) {
Icon(Icons.Default.Favorite, contentDescription = null)
}
}
}
}
}
}
}
}
< /code>
Я также попробовал метод из перетаскивания и отброса в Compose CodeLab, но его больше передачи данных между одним элементом в другой. Что я не пытаюсь архивировать.
Есть ли какое-либо готовое решение, которое мне не хватает, или я должен реализовать эту функцию с помощью modifier.offset () Подробнее здесь: https://stackoverflow.com/questions/796 ... id-compose