【问题标题】:The LazyColumn is always reload twice, it has duplicate content twiceLazyColumn 总是重新加载两次,它有两次重复的内容
【发布时间】:2022-12-21 17:14:27
【问题描述】:

这是我的代码:

@Composable
fun GetPathList(context: Activity, path: String) {
    val resultJson = remember { mutableStateListOf<RequestData.PathData>() }
    var loadingPicController by remember { mutableStateOf(true) }
    if (loadingPicController) {
        Text("loading")
    }
    thread {
        resultJson.addAll(RequestData().getPath(path))
        loadingPicController = false // Loading End
    }
    LazyColumn(verticalArrangement = Arrangement.spacedBy(4.dp)) {
        items(resultJson) { item ->
            Surface(modifier = Modifier.clickable {
                val intent = Intent(context, PathDetailsActivity::class.java)
                intent.putExtra("folderName", item.name)
                intent.putExtra("path", "$path/${item.name}")
                context.startActivity(intent)
            }) {
                Row(
                    modifier = Modifier
                        .padding(start = 24.dp, top = 8.dp, bottom = 8.dp)
                        .fillMaxWidth(),
                    verticalAlignment = Alignment.CenterVertically
                ) {

                    Icon(painter = Icons.Document, contentDescription = "Files", modifier = Modifier.size(28.dp))
                    Column(modifier = Modifier.padding(start = 16.dp)) {
                        Text(item.name, fontWeight = FontWeight.Medium, fontSize = 14.sp)
                        Text(item.type, fontWeight = FontWeight.Light, fontSize = 12.sp)
                    }
                }
            }
        }
    }
}

正确的结果在这里

但是,使用代码,加载完成后,列表被重新加载了两次。 它应该只加载一次。
但是现在在加载动画结束后它加载了两次并且内容重复了两次

【问题讨论】:

  • 查看this answer 正确获取初始数据的方法。

标签: android-jetpack-compose


【解决方案1】:

发生这种情况是因为每次执行可组合函数时,都会启动一个新的 thread 并再次添加所有项目。 基本上当前的流程是:

  1. GetPathList 被执行。 loadingPicControllertrue 并执行一个新线程。

  2. thread 完成时,loadingPicController 标志设置为false,导致重组(再次调用GetPathList)。

  3. GetPathList 再次被呼叫。 thread 再次被触发,再次添加项目。由于loadingPicController 已经是false,重组没有发生。

【讨论】:

    【解决方案2】:

    项目带有一个关键参数,您可以使用该参数来防止任何重复,并确保在有更新时更新正确的项目。无论如何,如果失败,您可以使用list.distinct()帮助清除任何重复项

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-19
      • 1970-01-01
      • 2017-02-20
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多