DEV Community

myougaTheAxo
myougaTheAxo

Posted on • Originally published at zenn.dev

Drag and Drop Reordering in Compose - ReorderableLazyList (v2)

Implement intuitive drag-and-drop reordering in Compose lists. Learn how to use ReorderableLazyList and handle pointer events for smooth interactions.

Basic ReorderableLazyList Setup

Use the reorderable modifier from org.burnoutcrew.reorderable:

val items = remember { mutableStateOf(listOf("Item 1", "Item 2", "Item 3")) }
val reorderState = rememberReorderableLazyListState(
    onMove = { from, to ->
        items.value = items.value.toMutableList().apply {
            add(to.index, removeAt(from.index))
        }
    }
)

LazyColumn(state = reorderState.listState,
    modifier = Modifier.reorderable(reorderState)) {
    items(items.value.size) { index ->
        ReorderableItem(reorderState, key = items.value[index]) {
            Text(items.value[index],
                modifier = Modifier.draggableHandle())
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Handling Drag State and Visual Feedback

Provide visual feedback during drag operations:

ReorderableItem(
    reorderState = reorderState,
    key = item.id,
    modifier = Modifier.alpha(if (isDragging) 0.5f else 1f)
) {
    Surface(
        modifier = Modifier
            .fillMaxWidth()
            .padding(8.dp)
            .background(
                if (isDragging) Color.LightGray else Color.White
            )
            .draggableHandle(
                onDrag = { offset ->
                    // Handle custom drag behavior
                }
            ),
        shape = RoundedCornerShape(8.dp)
    ) {
        Text(item.name)
    }
}
Enter fullscreen mode Exit fullscreen mode

Custom Drag Behavior with Pointer Events

For advanced control, use pointer events directly:

Modifier
    .pointerInput(Unit) {
        detectDragGesturesAfterLongPress(
            onDrag = { change, offset ->
                change.consume()
                // Update drag position
            },
            onDragEnd = {
                // Finalize reorder
            }
        )
    }
Enter fullscreen mode Exit fullscreen mode

Drag-and-drop enhances user experience for list management. Test on various screen sizes for consistent behavior.

8 Android app templates on Gumroad

Top comments (0)