android - 如何在 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()
}
}
解决方案
一种方法是随机打乱元素并首先获取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()
推荐阅读
- javascript - 动态创建时隐藏的输入字段,对于临时存储字符串没有多大用处
- python - Python Idle 编辑中的代码不会在 shell 中运行
- reactjs - useEffect 在分页更改时使 axios 调用两次(?)
- r - 通过函数将回归对象附加到列表
- asp.net-identity - Onion Architecture - 接口中的 DTO
- python - Spyder:如何更改变量资源管理器中的范围以显示已定义函数甚至 main() 中的变量?
- java - 如何从 Android 中的另一个活动更改 UI 元素?
- python - django 内置的密码重置视图是否可以与继承自 AbstractBaseUser 的自定义用户一起使用?
- c# - 如何通过点击事件控制 MapControl 图钉文本
- c# - AutoMapper 返回空和 null