Vaibhav Jaiswal
03/28/2024, 12:18 PM@Composable
fun TestPager() {
val pagerState = rememberPagerState(0){ 2 }
HorizontalPager(
state = pagerState,
modifier = Modifier.fillMaxSize(),
){
TestPage(it)
}
}
@Composable
fun TestPage(index: Int) {
val listState = rememberLazyListState()
LazyColumn(
state = listState,
modifier = Modifier.fillMaxSize()
){
items(40) {
Surface(modifier = Modifier.fillMaxSize()){
Text(text = "Row $it", modifier = Modifier.padding(16.dp))
}
}
}
}
youssef
03/28/2024, 12:20 PM/**
* Static field, contains all scroll values
*/
private val saveMap = mutableMapOf<String, KeyParams>()
private data class KeyParams(
val params: String = "",
val index: Int,
val scrollOffset: Int,
)
/**
* Save scroll state on all time.
* @param key value for comparing screen
* @param params arguments for find different between equals screen
* @param initialFirstVisibleItemIndex see [LazyListState.firstVisibleItemIndex]
* @param initialFirstVisibleItemScrollOffset see [LazyListState.firstVisibleItemScrollOffset]
*/
@Composable
fun rememberScrollPositionListState(
key: String,
params: String = "",
initialFirstVisibleItemIndex: Int = 0,
initialFirstVisibleItemScrollOffset: Int = 0,
): LazyListState {
val scrollState =
rememberSaveable(saver = LazyListState.Saver) {
var savedValue = saveMap[key]
if (savedValue?.params != params) savedValue = null
val savedIndex = savedValue?.index ?: initialFirstVisibleItemIndex
val savedOffset = savedValue?.scrollOffset ?: initialFirstVisibleItemScrollOffset
LazyListState(
savedIndex,
savedOffset,
)
}
DisposableEffect(Unit) {
onDispose {
val lastIndex = scrollState.firstVisibleItemIndex
val lastOffset = scrollState.firstVisibleItemScrollOffset
saveMap[key] = KeyParams(params, lastIndex, lastOffset)
}
}
return scrollState
}
Vaibhav Jaiswal
03/28/2024, 12:23 PMSean Proctor
03/28/2024, 12:40 PMVaibhav Jaiswal
03/28/2024, 12:42 PMSean Proctor
03/28/2024, 12:45 PMSean Proctor
03/28/2024, 12:47 PMVaibhav Jaiswal
03/28/2024, 12:53 PMinternal val pages: List<FeedPagesConfig> = listOf(
FeedPagesConfig.Trending,
FeedPagesConfig.Latest
)
internal val listStates = pages.associateWith { LazyListState() }
and then fetching this listState in my composableVaibhav Jaiswal
03/28/2024, 12:54 PMSean Proctor
03/28/2024, 1:00 PMVaibhav Jaiswal
03/28/2024, 1:02 PMLazyPagingItems<T>
has itemCount = 0
and loadState.mediator = null
Sean Proctor
03/28/2024, 1:15 PMTestPager
first, without any saving. remember { List(2) { LazyListState() } }
and pass the state to TestPage
by index. If that works, then you'll need to write a saver. https://developer.android.com/reference/kotlin/androidx/compose/runtime/saveable/package-summary#listSaver(kotlin.Function2,kotlin.Function1) Seems pretty straight forward.