Android中LiveData返回10条列表但for循环仅遍历2条如何解决
LiveData列表遍历不全问题解决方法
你遇到的toString()能看到全部10个元素、循环仅打印2个元素就停止的问题,本质是遍历执行到第三个元素时抛出了未捕获的异常,直接终止了循环,只是你没在Logcat中过滤到对应的错误堆栈,和LiveData的数据发射、列表本身长度无关。
第一步:先定位具体报错
先给遍历逻辑加索引和异常捕获,就能直接看到具体报错原因:
myLiveData.observe(this) { items -> Log.i("TAG", "全量列表内容:$items") // 带索引+异常捕获遍历 for ((index, item) in items.withIndex()) { try { Log.i("TAG", "第${index}个元素code值:${item.code}") } catch (e: Exception) { Log.e("TAG", "遍历到第${index}个元素时触发异常", e) } } }
常见触发原因与对应修复
- 类型不匹配:你声明列表泛型是
List<Items>(复数类名),但循环里写的遍历类型是Item(单数类名),大概率是导包错误导入了其他同名类、或者实体类名拼写错误,遍历到第三个元素时触发类型转换异常。修正循环内的类型声明、核对导包即可。 - 空指针异常:从第三个元素开始,
item.code字段值为null,如果你工程里把Kotlin空安全检查配置为异常级别,访问null字段会直接抛出NPE终止循环。把i.code改成i.code?:""做空处理即可。 - 自定义List实现的迭代器bug:如果
items是Room、Retrofit或者其他自定义组件返回的非标准JDK List实现,它的iterator()方法可能存在逻辑bug提前终止迭代。你可以先把列表转成标准ArrayList再遍历:val stableList = ArrayList(items) // 后续遍历stableList即可 - Log方法参数不匹配:如果
code字段是Int类型,而你误用了只接收String参数的自定义Log工具类,遍历到第三个元素时会触发参数类型不匹配异常,替换为系统原生Log、或者把code转成String再打印即可。
内容的提问来源于stack exchange,提问作者Erick
相关产品推荐
相关产品推荐

