首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从惰性列列表中删除

从惰性列列表中删除
EN

Stack Overflow用户
提问于 2021-10-06 15:04:02
回答 2查看 184关注 0票数 0

每当我尝试从惰性列列表中删除时,都会得到arrayIndexOutOfBoundException,这是

代码语言:javascript
复制
var productsList = remember { mutableStateListOf<Product>() }//I load products in this list

每当用户按下某个按钮时,我都会执行以下操作

代码语言:javascript
复制
productsList.remove(item) 

我得到数组arrayIndexOutOfBoundException,这也是我循环的方式

代码语言:javascript
复制
itemsIndexed(productsList) { index, item ->

不管怎样,为了避免这个错误

对于那些感兴趣的人来说,完整的代码:

代码语言:javascript
复制
fun MyProducts(navController: NavController,myProductsViewModel: MyProductsViewModel= viewModel()) {
    var productsList = remember { mutableStateListOf<Product>() }
    val scope = rememberCoroutineScope()

    val listState = rememberLazyListState()

    var currentImage = remember { mutableStateListOf<Int>() }

    LaunchedEffect(key1 = Unit){
       myProductsViewModel.getShop()
        productsList.addAll(myProductsViewModel.productsList)
        currentImage.addAll(List(productsList.size) {0})

    }
    var pickedImage: MutableState<String?> =remember { mutableStateOf("") }


    BackHandler() {
        navController.popBackStack()
    }
       LazyColumn(
           Modifier
               .fillMaxSize()
               .padding(start = 16.dp),
            horizontalAlignment = Alignment.Start,
            verticalArrangement = Arrangement.spacedBy(8.dp)
            ,state = listState
        ) {
           itemsIndexed(productsList) { index, item ->
                                   .clickable {when(icon){
                                       Icons.Default.Delete->{
                                           scope.launch {
                                               myProductsViewModel.removeProducts(item.product_id,item.shop_id,item)
                                            productsList.remove(item)
                                           }
                                       }
                                       Icons.Default.Edit->{

                                       }

我在其余代码中访问相同的列表,但我认为它与问题无关

EN

回答 2

Stack Overflow用户

发布于 2021-10-06 16:24:47

您没有提供正确的代码示例,但是听起来您没有正确地更新列表和lazy列,因此该项将从列表中删除,但是lazy列并不知道这一点。

票数 0
EN

Stack Overflow用户

发布于 2021-10-06 19:08:10

在我看来,您的代码中通常存在一些不好的做法。例如:

代码语言:javascript
复制
LaunchedEffect(key1 = Unit){
   myProductsViewModel.getShop()
    productsList.addAll(myProductsViewModel.productsList)
    currentImage.addAll(List(productsList.size) {0})
}

这一切看起来都像是应该在视图模型中完成的事情。一般来说,composable应该将状态转换为UI,也就是说,它不应该包含任何业务逻辑。我刚刚展示的代码看起来像是可以在视图模型中完成的操作。

拥有像这样的东西

代码语言:javascript
复制
var productsList = remember { mutableStateListOf<Product>() }

然后,使用LaunchedEffect添加元素并不是使用composables的方式。

首先,您的myProductsViewModel.productsList应该是一个保存产品列表的LiveData对象。然后,您应该执行以下操作:

代码语言:javascript
复制
val productList by myProductsViewModel.productsList.observeAsState(emptyList())

然后在您的composable中显示它。如果你想改变列表内容,你应该在视图模型上调用一个方法,然后它会相应地更新列表的livedata对象。

我你希望我说得够清楚了。如果你有什么问题,请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69468191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档