0

Hi
I am using Jetpack Compose to create a Heterogenous list. I was successful in implementing it. My requirement is when I try to click an Item in the list, I need to recompose the list. The app crashes when tried to refresh the list with below exception:

java.lang.IllegalStateException: Vertically scrollable component was measured with an infinity maximum height constraints, which is disallowed. One of the common reasons is nesting layouts like LazyColumn and Column(Modifier.verticalScroll()). If you want to add a header before the list of items please add a header as a separate item() before the main items() inside the LazyColumn scope. There are could be other reasons for this to happen: your ComposeView was added into a LinearLayout with some weight, you applied Modifier.wrapContentSize(unbounded = true) or wrote a custom layout. Please try to remove the source of infinite constraints in the hierarchy above the scrolling container

My code is below:

@Composable fun PrepareOverViewScreen(overViewList: List<OverViewListItem>) {
Scaffold(topBar = { TopBar("OverView") },
    content = { DisplayOverViewScreen(overViewList = overViewList) },
    backgroundColor = Color(0xFFf2f2f2)
)

     }

 @Composable fun DisplayOverViewScreen(
        modifier: Modifier = Modifier, overViewList: List<OverViewListItem>
    ) { 
        LazyColumn(modifier = modifier) {
          items(overViewList) { data ->
            when (data) {
                   is OverViewHeaderItem -> {
                        HeaderItem(data,overViewList)
                    }
                 
                }
            } 
        } 
    }

HeaderItem Composable Function is below :

   @Composable fun HeaderItem(overViewHeaderItem: OverViewHeaderItem,overViewList: List<OverViewListItem>) {  <br>
    
        var angle by remember {
            mutableStateOf(0f)
        } 
    
        var canDisplayChild by remember {
            mutableStateOf(false)
        } 
    
        **if(canDisplayChild){
            HandleHistoryTodayChild(canDisplayChild = true,overViewList)
        }**
    
        when (overViewHeaderItem.listType) {
            ItemType.IN_PROGRESS_HEADER -> {
                Column(
                    modifier = Modifier
                        .fillMaxWidth()
                        .height(50.dp)
                        .background(color = Color(0xffdc8633)),
                    verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.Start
                ) {
                    Text(
                        text = "In Progress", color = Color.White,
                        modifier = Modifier.padding(start = 16.dp)
                    )
                }
    
            }
            ItemType.HISTORY_TODAY_HEADER -> {
                Column(
                    modifier = Modifier
                        .fillMaxWidth()
                        .height(50.dp)
                        .background(color = Color(0xffd7d7d7)),
                    verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.Start
                ) {
                    Text(
                        text = stringResource(R.string.history_label), color = Color.Black,
                        modifier = Modifier.padding(start = 16.dp)
                    )
                }
            }
            else -> {
                 Row(modifier = Modifier
                     .fillMaxWidth()
                     .height(50.dp)
                     .background(color = Color(0xffd7d7d7)),
                     horizontalArrangement = Arrangement.Start, verticalAlignment = Alignment.CenterVertically) {
                     Text(
                         text = stringResource(R.string.history_yesterday), color = Color.Black,
                         modifier = Modifier.padding(start = 16.dp)
                     )
                     Spacer(Modifier.weight(1f))
                     **Image(
                         painter = painterResource(id = R.drawable.ic_expand_more),
                         modifier = Modifier
                             .padding(end = 5.dp)
                             .rotate(angle)
                             .clickable {
                                 angle = (angle + 180) % 360f
                                 canDisplayChild = !canDisplayChild
                             },
                         contentDescription = "Expandable Image"
                     )**
                 }
    
                }
        }
    }

Handle History info where recomposition is called

@Composable
fun HandleHistoryTodayChild(canDisplayChild:Boolean,overViewList: List<OverViewListItem>) {
    if(canDisplayChild){
        
        **PrepareOverViewScreen(overViewList = overViewList)**
    }
}

1 Answers1

0

Your problem should be:

Spacer(Modifier.weight(1f))

Try to specify a fixed height and work your solution from there.

F.Mysir
  • 2,838
  • 28
  • 39
  • I removed "Spacer(Modifier.weight(1f))" and tried to execute my code. But still gives below errror: java.lang.IllegalArgumentException: Can't represent a size of 2147483493 in Constraints. I included LazyColumn as part of Scafold . Is it creating some problem ? Scaffold(topBar = { TopBar("OverView") }, content = { DisplayOverViewScreen(overViewList = overViewList) }, backgroundColor = Color(0xFFf2f2f2) ) – Android_programmer_office Jan 16 '23 at 10:27