[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() 方法:```javaCollections.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的调用。如下:
![[转][M][Launcher]主菜单图标改成时间排序 - 图1](%5BM%5D%E4%B8%BB%E8%8F%9C%E5%8D%95%E5%9B%BE%E6%A0%87%E6%94%B9%E6%88%90%E6%97%B6%E9%97%B4%E6%8E%92%E5%BA%8F.assets/6354656048961537501895560231%E6%9C%AA%E5%91%BD%E5%90%8D.bmp#align=left&display=inline&margin=%5Bobject%20Object%5D&status=done&style=none)
