Kotlin中如何从ArrayList中随机取出10-20条数据进行展示
Kotlin 随机展示10~20个已安装应用实现方案
原代码存在性能缺陷:Adapter 刷新逻辑被放在 for 循环内部,每遍历到一个符合条件的应用就会触发一次列表重绘,建议先把这部分逻辑移到循环外部。
实现思路如下:
- 先过滤出所有带有启动意图的可展示应用,得到完整的有效应用列表
- 随机生成本次展示的应用数量,区间为 10~20;如果有效应用总数不足 10,则直接取全部数量
- 将有效列表随机打乱后,截取对应数量的子集交给 Adapter 渲染
修改后的完整代码:
private fun onGetApps() { val pm: PackageManager = requireContext().packageManager val allPackages = requireContext().packageManager.getInstalledPackages(PackageManager.GET_META_DATA) // 过滤出有启动意图的应用,同时完成数据转换 val allValidApps = allPackages.mapNotNull { pkg -> if (pm.getLaunchIntentForPackage(pkg.packageName) == null) return@mapNotNull null Apps().apply { appName = pkg.applicationInfo.loadLabel(pm).toString() appImage = pkg.applicationInfo.loadIcon(pm) } } // 计算本次要抽取的应用数量 val targetCount = if (allValidApps.size <= 10) { allValidApps.size } else { // 生成10到20之间的随机数,若总应用数不足20则取最大值为总数量 (10..minOf(20, allValidApps.size)).random() } // 打乱列表后取对应数量的随机子集 val randomShowApps = allValidApps.shuffled().take(targetCount) // 单次刷新列表 mAdapter.setupApps(randomShowApps) mAdapter.notifyDataSetChanged() }
用到的 Kotlin 标准库方法说明:
mapNotNull:遍历集合时自动过滤掉 null 结果,无需手动创建集合添加元素,代码更简洁shuffled():集合内置打乱方法,返回打乱顺序后的新集合,不会修改原始列表ClosedRange.random():区间类内置的随机取值方法,可直接生成指定区间内的随机整数,无需手动写随机数逻辑
内容的提问来源于stack exchange,提问作者Armenak Mkhitaryan
相关产品推荐
相关产品推荐

