我正在为手机创建启动器,我需要按字母对应用程序进行排序。
Appslist = ArrayList<AppInfo>()
val i = Intent(Intent.ACTION_MAIN, null)
i.addCategory(Intent.CATEGORY_LAUNCHER)
val allApps = this.packageManager.queryIntentActivities(i, 0)
for (ri in allApps) {
val app = AppInfo()
app.label = ri.loadLabel(this.packageManager)
app.packageName = ri.activityInfo.packageName
app.icon = ri.activityInfo.loadIcon(this.packageManager)
if(app.label?.toString()!!.length >= searchWord.length && app.label?.toString()!!.substring(0, searchWord.length) == searchWord.toUpperCase() && searchWord != "" ||
app.label?.toString()!!.length >= searchWord.length && app.label?.toString()!!.substring(0, searchWord.length) == searchWord.toLowerCase() && searchWord != "" ||
app.label?.toString()!!.length >= searchWord.length && app.label?.toString()!!.substring(0, searchWord.length) == searchWord.capitalize() && searchWord != "" ||
app.label?.toString()!!.length >= searchWord.length && app.label?.toString()!!.substring(0, searchWord.length) == searchWord && searchWord != ""){
if(app.packageName != "com.david.launcher" ){
Appslist.add(app)
}
}
if(searchWord == ""){
if(app.packageName != "com.david.launcher"){
Appslist.add(app)
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的列表类型(我真的不知道它是否称为列表类型,但希望您能理解):
public class AppInfo {
internal var label: CharSequence? = null
internal var packageName: CharSequence? = null
internal var icon: Drawable? = null
internal var isInFav: Boolean? = false
Run Code Online (Sandbox Code Playgroud)
Jay*_*ard 10
惯用的方法是sortedBy,List如果要分类到列表的副本中,请使用扩展方法。或者sortBy,MutableList如果您要就地排序而不使用副本,请在上使用扩展名。一个ArrayList会工作的任一列表类型。
// Sort a readonly list into a copy of the list
val appsList: List<AppInfo> = ...
val sortedAppsList = appsList.sortedBy { it.label?.toString() }
Run Code Online (Sandbox Code Playgroud)
与:
// Sort a mutable list in-place
val appsList: MutableList<AppInfo> = ...
appList.sortBy { it.label?.toString() }
Run Code Online (Sandbox Code Playgroud)
如果保持ArrayList不变,则直接引用此具体类型,但这不是惯用的。
// Sort an ArrayList list into a copy of the list
val appsList: ArrayList<AppInfo> = ... // ALERT! not idiomatic
val sortedAppsList = appsList.sortedBy { it.label?.toString() }
// or if you want, feel free to sort in-place
appsList.sortBy { it.label?.toString() }
Run Code Online (Sandbox Code Playgroud)
注意成员toString()上的label: CharSequence。您必须小心地对类型的引用进行排序,因为类型CharSequence是未定义的,排序的行为是什么(请参阅:https : //docs.oracle.com/javase/7/docs/api/java/lang/CharSequence.html)
此接口不会优化equals和hashCode方法的常规协定。因此,比较两个实现CharSequence的对象的结果通常是不确定的。
如果CharSequences已经是一个String(可能是),则调用不会带来任何危害,toString()因为它只会返回自身。
还请记住,CharSequence必须同时处理可为空的值,并且您需要确定想要为空的位置:在列表的开头或结尾。我认为默认设置是让他们开始。
有关问题中代码的其他说明:
使用Listor MutableList接口而不是具体的类来引用类型,并使用Kotlin stdlib中的方法对列表进行操作。也可以使用val而不是var进行更改的引用(这意味着它将始终指向同一列表,而不管列表内容是否可以更改)。
if您所拥有的重要声明可以减少很多,从...开始
if(app.label?.toString()!!.length >= searchWord.length && app.label?.toString()!!.substring(0, searchWord.length) == searchWord.toUpperCase() && searchWord != "" ||
app.label?.toString()!!.length >= searchWord.length && app.label?.toString()!!.substring(0, searchWord.length) == searchWord.toLowerCase() && searchWord != "" ||
app.label?.toString()!!.length >= searchWord.length && app.label?.toString()!!.substring(0, searchWord.length) == searchWord.capitalize() && searchWord != "" ||
app.label?.toString()!!.length >= searchWord.length && app.label?.toString()!!.substring(0, searchWord.length) == searchWord && searchWord != ""){
if(app.packageName != "com.david.launcher" ){
Appslist.add(app)
}
}
if(searchWord == ""){
if(app.packageName != "com.david.launcher"){
Appslist.add(app)
}
}
Run Code Online (Sandbox Code Playgroud)
更简单:
if (app.packageName != "com.david.launcher" &&
(searchWord.isBlank() ||
app.label?.startsWith(searchWord, ignoreCase = true) == true)) {
appsList.add(app)
}
Run Code Online (Sandbox Code Playgroud)
您应该浏览标准库,以了解可用的资源,以便为将来扩展工具包。
| 归档时间: |
|
| 查看次数: |
3176 次 |
| 最近记录: |