Android Compose padding
Я начинающийй программист, уже долго не могу найти грамотного решения следующей проблемы: у меня есть элемент пагинации на странице а также Lazycolumn с элементами. в зависимости от того сколько на текущей странице элементов, я хочу располагать элемент пагинации либо внутри LazyColumn как item, либо отдельно внизу страницы, если скролла нет и элементов в LazyColumn мало. Как расположить в обоих случаях элемент пагинации в одном и том же месте? либо в общем изменить нужно подход, буду очень рад совету!
Scaffold(
topBar = {
ThemeTopBar(
titleText = buildAnnotatedString {
append(themeName)
append(" ")
withStyle(style = SpanStyle(fontSize = 14.sp, color = Color.Gray)) {
append("($totalSets sets)")
}
},
onBack = onBack
)
},
bottomBar = {
if (sets.size<9 && sets.isNotEmpty()) {
PaginationBar(
currentPage = currentPage,
totalPages = totalPages,
onPageChange = { page -> viewModel.setCurrentPage(page) },
)
}
},
modifier = modifier,
containerColor = Color(0xffeeeeee)
) { innerPadding ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(innerPadding)
.padding(horizontal = 12.dp, vertical = 6.dp)
) {
SetsList(
sets = sets,
listState = listState,
currentPage = currentPage,
totalPages = totalPages,
onSetClick = onSetClick,
onPageChange = { page -> viewModel.setCurrentPage(page) },
)
}
}
Вот сам LazyColumn - SetsList
LazyColumn(
state = listState,
modifier = modifier
) {
item {
ColumnHeader()
}
itemsIndexed(sets) { index, set ->
val backgroundColor = if (index % 2 == 0) Color.White else Color(0xfff1f5f8)
SetCard(set = set, backgroundColor = backgroundColor){ onSetClick(set.set_num)}
}
if (sets.size >= 9) {
item {
Spacer(modifier = Modifier.height(16.dp))
PaginationBar(
currentPage = currentPage,
totalPages = totalPages,
onPageChange = onPageChange,
)
}
}
}
Ответы (1 шт):
Вы немного некорректно ставите сами себе задачу. Вопрос должен звучать примерно так:
Как в рамках
LazyColumnэлемент списка прижать к низу экрана (лейаута).
По сути ведь PaginationBar является элементом списка LazyColumn и вы хотите расположить его в одном фиксированном месте (ну например внизу).
Как только вы сформулируете задачу в таком ключе то выход немедленно находится, например:
Column(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.SpaceBetween
) {
LazyColumn(...) {
items(items) { item -> ... }
}
PaginationBar()
}
Ну или LazyColumn, который свой последний элемент выравнивает к низу:
@Composable
fun LazyColumnLastElementBottomAlign(
contentPadding: PaddingValues,
modifier: Modifier,
verticalPadding: Dp,
horizontalPadding: Dp,
content: LazyListScope.() -> Unit,
) {
LazyColumn(
verticalArrangement = remember {
object : Arrangement.Vertical {
override fun Density.arrange(
totalSize: Int,
sizes: IntArray,
outPositions: IntArray
) {
var currentOffset = 0
sizes.forEachIndexed { index, size ->
if (index == sizes.lastIndex) {
outPositions[index] = totalSize - size
} else {
outPositions[index] = currentOffset
currentOffset += size
}
}
}
}
},
modifier = modifier
.padding(
start = horizontalPadding,
end = horizontalPadding,
top = contentPadding.calculateTopPadding() + verticalPadding,
)
.fillMaxHeight(),
content = content,
)
}