LazyColumn to not recompose some items

Viewed 793

With RecyclerView, I can make some ViewHolder not recyclable (follow some answers in I want my RecyclerView to not recycle some items).
Can I make LazyColumn to not recompose some items (similar to make RecyclerView don't recycle some ViewHolder)? I have few items in LazyColumn with some big images, it recompose after scrolling down and up so scroll is not smooth.

2 Answers

I met the same problem and use Column instead with a modifier vertical scroll. If you don't want it recycle view, just load all ( few items)

Column(
            modifier = Modifier
                .constrainAs(listView) {
                    top.linkTo(
                        parent.top
                    )
                }
                .fillMaxSize()
                .verticalScroll(rememberScrollState())
        ) {
            list.forEachIndexed { index, itemModel ->
               ItemView(itemModel, index) {
                    // on item click
                }
            }
            Spacer(modifier = Modifier.height(40.dp))
        }

I had a similar issue with a composable that is heavily manipulating bitmaps and then draw them on a canvas. You noticed that processing while scrolling the lazyColumn up and down.

To face this issue a stored my manipulated bitmaps in a List<ImageBitmap> as rememberSaveable

val rememberFruits by rememberSaveable(images) {         
    mutableStateOf(doBitmapOperations(images))
}

Canvas(
    modifier = Modifier
        .fillMaxWidth()
        .height(height)
        .constrainAs(circle) {}
) {
    rememberFruits
        .forEach { createScaledImageBitmap ->
            val (image, offset) = createScaledImageBitmap
            drawImage(
                image = image,
                topLeft = offset
            )
        }
}

My item in the lazyColumn was still recomposed but the heavy bitmap operations were no more executed while scrolling and making scrolling up and down smooth.

hope it helps!

Related