LazyListPrefetchStrategy


Implementations of this interface control which indices of a LazyList should be prefetched (precomposed and premeasured during idle time) as the user interacts with it.

Implementations should invoke LazyListPrefetchScope.schedulePrefetch to schedule prefetches from the onScroll and onVisibleItemsUpdated callbacks. If any of the returned PrefetchHandles no longer need to be prefetched, use LazyLayoutPrefetchState.PrefetchHandle.cancel to cancel the request.

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.layout.LazyLayoutCacheWindow
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.Text
import androidx.compose.runtime.State
import androidx.compose.runtime.remember
import androidx.compose.ui.unit.Density

val itemsList = (0..100).toList()
val state = rememberLazyListState()

// Migrating from LazyListPrefetchStrategy (which scheduled prefetching for individual items):
// Use LazyLayoutCacheWindow to dynamically calculate the prefetch cache window in pixels based
// on average item size from LazyListState layoutInfo.
val customCacheWindow =
    remember(state) {
        object : LazyLayoutCacheWindow {
            override fun Density.calculateAheadWindow(viewport: Int): Int {
                val visibleItems = state.layoutInfo.visibleItemsInfo
                if (visibleItems.isEmpty()) return 0
                val averageItemHeight = visibleItems.sumOf { it.size } / visibleItems.size
                // Prefetch 1 item ahead based on average item size
                return averageItemHeight
            }
        }
    }

LazyColumn(state = state, cacheWindow = customCacheWindow) {
    items(itemsList) { item -> Text("Item $item") }
}

Summary

Public functions

Unit
NestedPrefetchScope.onNestedPrefetch(firstVisibleItemIndex: Int)

This function is deprecated. LazyListPrefetchStrategy is deprecated in favor of LazyLayoutCacheWindow.

Cmn
Unit
LazyListPrefetchScope.onScroll(
    delta: Float,
    layoutInfo: LazyListLayoutInfo
)

This function is deprecated. LazyListPrefetchStrategy is deprecated in favor of LazyLayoutCacheWindow.

Cmn
Unit

This function is deprecated. LazyListPrefetchStrategy is deprecated in favor of LazyLayoutCacheWindow.

Cmn

Public properties

open PrefetchScheduler?

This property is deprecated. Customization of PrefetchScheduler is no longer supported.

Cmn

Public functions

NestedPrefetchScope.onNestedPrefetch

fun NestedPrefetchScope.onNestedPrefetch(firstVisibleItemIndex: Int): Unit

onNestedPrefetch is invoked when a parent LazyLayout has prefetched content which contains this LazyList. It gives this LazyList a chance to request prefetch for some of its own children before coming onto screen.

Implementations can use NestedPrefetchScope.schedulePrefetch to schedule child prefetches. For example, this is useful if this LazyList is a LazyRow that is a child of a LazyColumn: in that case, onNestedPrefetch can schedule the children it expects to be visible when it comes onto screen, giving the LazyLayout infra a chance to compose these children ahead of time and reduce jank.

Generally speaking, onNestedPrefetch should only request prefetch for children that it expects to actually be visible when this list is scrolled into view.

Parameters
firstVisibleItemIndex: Int

the index of the first visible item. It should be used to start prefetching from the correct index in case the list has been created at a non-zero offset.

LazyListPrefetchScope.onScroll

fun LazyListPrefetchScope.onScroll(
    delta: Float,
    layoutInfo: LazyListLayoutInfo
): Unit

onScroll is invoked when the LazyList scrolls, whether or not the visible items have changed. If the visible items have also changed, then this will be invoked in the same frame after onVisibleItemsUpdated.

Parameters
delta: Float

the change in scroll direction. Delta < 0 indicates scrolling down while delta > 0 indicates scrolling up.

layoutInfo: LazyListLayoutInfo

the current LazyListLayoutInfo

LazyListPrefetchScope.onVisibleItemsUpdated

fun LazyListPrefetchScope.onVisibleItemsUpdated(
    layoutInfo: LazyListLayoutInfo
): Unit

onVisibleItemsUpdated is invoked when the LazyList scrolls if the visible items have changed.

Parameters
layoutInfo: LazyListLayoutInfo

the current LazyListLayoutInfo. Info about the updated visible items can be found in LazyListLayoutInfo.visibleItemsInfo.

Public properties

prefetchScheduler

open val prefetchSchedulerPrefetchScheduler?

A PrefetchScheduler implementation which will be used to execute prefetch requests for this strategy implementation. If null, the default PrefetchScheduler for the platform will be used.