[FAQ08556]如何将主菜单图标改成按安装时间排序
[DESCRIPTION]
Launcher主菜单图标默认是按名称来排序的,如何将主菜单改成按安装时间来排序?
[SOLUTION]
M:
- 参考AppNameComparator.java新增:AppInstallTimeComparator.java;
在AlphabeticalAppsList.java新增变量:
private AppInstallTimeComparator mAppInstallTimeComparator;
修改AlphabeticalAppsList.java 的构造函数:
mAppNameComparator = new AppNameComparator(context);
// 替换成:
mAppInstallTimeComparator= new AppInstallTimeComparator(context);
修改AlphabeticalAppsList.java 的 onAppsUpdated() 方法:
Collections.sort(mApps, mAppNameComparator.getAppInfoComparator());
// 替换成:
Collections.sort(mApps, mAppInstallTimeComparator.getAppInstallTimeComparator());
修改AlphabeticalAppsList.java 的 onAppsUpdated() 方法:
sectionMap = new TreeMap<>(mAppNameComparator.getSectionNameComparator());
// 替换成:
sectionMap = new TreeMap<>(mAppInstallTimeComparator.getSectionNameComparator());
L以前版本:
- 在 LauncherModel.java 中加入如下方法:
```java
public static final Comparator
getInstallTimeComparator() { return new Comparator () { public final int compare(AppInfo a, AppInfo b) {
} }; }return a.firstInstallTime == b.firstInstallTime ? 0 : a.firstInstallTime > b.firstInstallTime ? 1:-1;
public static class InstallTimeComparator implements Comparator
private PackageManager mPackageManager;
List<ResolveInfo> mapps;
InstallTimeComparator(PackageManager pm, List<ResolveInfo> apps) {
mPackageManager = pm;
mapps = apps;
}
public final int compare(ResolveInfo a, ResolveInfo b) {
String packageNameA = a.activityInfo.applicationInfo.packageName;
String packageNameB = b.activityInfo.applicationInfo.packageName;
long firstInstallTimeA = 0, firstInstallTimeB = 0;
try{
firstInstallTimeA = mPackageManager.getPackageInfo(packageNameA, 0).firstInstallTime;
firstInstallTimeB = mPackageManager.getPackageInfo(packageNameB, 0).firstInstallTime;
}catch(Exception e){
e.printStackTrace();
return 0;
}
return firstInstallTimeA == firstInstallTimeB ? 0 : firstInstallTimeA > firstInstallTimeB ? 1:-1;
}
};
2. 修改 LauncherModel.java 的 loadAllAppsByBatch() 方法:
```java
Collections.sort(apps,new LauncherModel.ShortcutNameComparator(packageManager, mLabelCache));
// 替换成:
Collections.sort(apps,new InstallTimeComparator(packageManager, apps));
修改 AppsCustomizePagedview.java 的 setApps 方法
Collections.sort(mApps, LauncherModel.getAppNameComparator());
// 替换成:
Collections.sort(mApps, LauncherModel.getInstallTimeComparator());
reorderApps()在某些条件下会被调用,如果要求在那些条件下也要达到按照安装时间排序,请在调用reorderApps方法前增加
Collections.sort(mApps, LauncherModel.getInstallTimeComparator());
例如:新安装应用后仍然要按照安装时间排序,需要在AppsCustomizePagedview.java的addApps方法中增加sort的调用。如下: