首页 > 解决方案 > 如何在 Kotlin 中显示来自 ArrayList 的随机数据?

问题描述

我有一个安装在设备上的应用程序列表。现在我想显示 10-20 个(应用程序的数量应该总是不同的)随机应用程序的列表,我该如何在 Kotlin 中做到这一点?

我的代码:

private fun onGetApps() {
        val pm: PackageManager = requireContext().packageManager
        val apps: List<PackageInfo> = requireContext().packageManager.getInstalledPackages(PackageManager.GET_META_DATA)
        val res: ArrayList<Apps> = ArrayList<Apps>()

        for (i in apps.indices) {

            if (pm.getLaunchIntentForPackage (apps[i].packageName) != null)
            {
                val p = apps[i]

                val appInfo = Apps()

                appInfo.appName = p.applicationInfo.loadLabel(requireContext().packageManager).toString()
                appInfo.appImage = p.applicationInfo.loadIcon(requireContext().packageManager)
                res.add(appInfo)
            }

            mAdapter.setupApps(res)
            mAdapter.notifyDataSetChanged()
        }
    }

标签: androidandroid-studiokotlinarraylist

解决方案


一种方法是随机打乱元素并首先获取n它们:

println((0..10).shuffled().take(3))

如果所有项目的数量远大于要采取的项目数量,那么使用序列可能是有意义的:

println((0..10).asSequence().shuffled().take(3).toList())

请注意,如果要获取的项目数大于所有项目的数量,它将返回源集合中的所有项目。

在您的情况下,它将类似于:

val res = apps.asSequence()
    .filter { pm.getLaunchIntentForPackage(it.packageName) != null }
    .shuffled()
    .take((10..20).random())
    .map { p ->
        val appInfo = Apps()

        appInfo.appName = p.applicationInfo.loadLabel(requireContext().packageManager).toString()
        appInfo.appImage = p.applicationInfo.loadIcon(requireContext().packageManager)
        
        appInfo
    }.toList()

推荐阅读