You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:57:01