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 шт):

Автор решения: Barmaley

Вы немного некорректно ставите сами себе задачу. Вопрос должен звучать примерно так:

Как в рамках 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,
    )
}
→ Ссылка