Переместите элемент LazyColumn в конец экрана, если LazyColumn пуст.

Я хочу добавить нижний колонтитул в LazyColumn, который появляется только при прокрутке всех элементов, но если в LazyColumn нет элементов или недостаточно элементов, чтобы покрыть весь экран, я хочу, чтобы нижний колонтитул отображался в нижней части экрана.

Поскольку мы не можем устанавливать веса в LazyColumn, есть ли другой способ добиться этого?

1 ответ

Вы можете использовать LazyListState#layoutInfoчтобы узнать, пуст ли список или есть ли свободное место внизу.

      val state = rememberLazyListState()

val isIniatialLoading by remember {
    derivedStateOf {
        state.layoutInfo.viewportSize  == IntSize.Zero
    }
}

//Empty list or empty space
val hasEmptySpace by remember {
    derivedStateOf {
        val layoutInfo = state.layoutInfo
        val visibleItemsInfo = layoutInfo.visibleItemsInfo
        if (layoutInfo.totalItemsCount == 0) {
            true
        } else {
            val lastVisibleItem = visibleItemsInfo.last()
            val viewportHeight = layoutInfo.viewportEndOffset + layoutInfo.viewportStartOffset
            
            (lastVisibleItem.index + 1 == layoutInfo.totalItemsCount &&
                    lastVisibleItem.offset + lastVisibleItem.size < viewportHeight)
        }
    }
}

Затем обернитеLazyColumnсColumnи применитьweightмодификатор к списку.

      Column(Modifier.fillMaxSize()) {

    LazyColumn(
        state = state,
        modifier = Modifier.weight(1f)
    ){
        items(itemsList) {
           //....
        }

        //Footer when the list covers the entire screen
        if (!hasEmptySpace){
            item(){
                //Footer()
            }
        }
    }
    
    // Display the Footer at the bottom of the screen if the list is empty or if there is an empty space
    if ( !isIniatialLoading && hasEmptySpace ){
       //Footer()
    }

}