Giorgi
02/11/2025, 5:42 PMWinson Chiu
02/11/2025, 5:46 PMWinson Chiu
02/11/2025, 5:47 PMWinson Chiu
02/11/2025, 5:47 PMGiorgi
02/11/2025, 5:47 PMWinson Chiu
02/11/2025, 5:48 PMGiorgi
02/11/2025, 5:50 PMSeri
02/11/2025, 5:50 PMrememberLazyListState()
has a lot of internal logic which manages visible items, fetching logic, as well as the scroll state. I wouldn't expect it to just work compared to something simpler, like rememberScrollState()
Seri
02/11/2025, 5:51 PMLazyListState
inherits from ScrollableState
, so maybe something like having a "parent" and "child" scrolling layout would be possibleWinson Chiu
02/11/2025, 5:51 PMscrollBy(delta)
on all of the columns.Giorgi
02/11/2025, 5:52 PMGiorgi
02/11/2025, 5:52 PMGiorgi
02/11/2025, 5:52 PMGiorgi
02/11/2025, 5:59 PMGiorgi
02/11/2025, 6:00 PMGiorgi
02/11/2025, 6:00 PMWinson Chiu
02/11/2025, 6:05 PMGiorgi
02/12/2025, 3:54 PM@Composable
fun SynchronizedScrollLazyColumns() {
val leftListState = rememberLazyListState()
val rightListState = rememberLazyListState()
val coroutineScope = rememberCoroutineScope()
fun syncScroll(leading: LazyListState, following: LazyListState) {
coroutineScope.launch {
val scrollPosition = leading.firstVisibleItemScrollOffset
following.scrollToItem(
index = leading.firstVisibleItemIndex,
scrollOffset = scrollPosition
)
}
}
// Observe scroll changes in the LEFT column
LaunchedEffect(leftListState.firstVisibleItemIndex, leftListState.firstVisibleItemScrollOffset) {
syncScroll(leftListState, rightListState)
}
// Observe scroll changes in the RIGHT column
LaunchedEffect(rightListState.firstVisibleItemIndex, rightListState.firstVisibleItemScrollOffset) {
syncScroll(rightListState, leftListState)
}
Row(
modifier = Modifier
.fillMaxSize()
.padding(16.dp)
) {
// Left Column (Leading Column)
LazyColumn(
modifier = Modifier
.weight(1f),
state = leftListState
) {
items(20) { index ->
Card(
modifier = Modifier
.fillMaxWidth()
.padding(4.dp),
elevation = CardDefaults.cardElevation(4.dp)
) {
Text(
text = "Left Item $index",
modifier = Modifier.padding(16.dp)
)
}
}
}
Spacer(modifier = Modifier.width(8.dp))
// Right Column (Following Column)
LazyColumn(
modifier = Modifier
.weight(1f),
state = rightListState
) {
items(20) { index ->
Card(
modifier = Modifier
.fillMaxWidth()
.padding(4.dp),
elevation = CardDefaults.cardElevation(4.dp)
) {
Text(
text = "Right Item $index",
modifier = Modifier.padding(16.dp)
)
}
}
}
}
}