java/android 对列表进行首字母排序

最近写一个android的文件管理器,用到对文件列表的排序,于是在网上找了一些资料。

刚开始使用这个算法:

List<String> mFilename1=new ArrayList<String>();
if (!mFilename1.isEmpty()) {    //不为空

           Collections.sort(mFilename1, new Comparator<String>() {

                @Override

                public int compare(String str1,

                                   String str2) {

                    //根据文本排序

                    return str1.compareTo(str2);
                }

            });


结果是:英文名称的文件排序正常,中文名称的排序并没有按照首字母顺序。

于是,又找了另一个方法:

Comparator cmp= Collator.getInstance(Locale.CHINA);
 Collections.sort(mFilename1,cmp);



OK!完美解决!

(新手,定期更新自己的学习笔记,可能有误,欢迎指正!)

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是获取应用包名,按照首字母排序并支持字母索引的完整实现代码: ```java public class MainActivity extends AppCompatActivity { private ListView mListView; private List<AppInfo> mAppInfos; private List<String> mSections; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView = findViewById(R.id.list_view); mAppInfos = new ArrayList<>(); mSections = new ArrayList<>(); // 获取应用包名 PackageManager pm = getPackageManager(); List<ApplicationInfo> apps = pm.getInstalledApplications(0); for (ApplicationInfo app : apps) { String packageName = app.packageName; String appName = pm.getApplicationLabel(app).toString(); // 添加到列表中 mAppInfos.add(new AppInfo(appName, packageName)); } // 按首字母排序 Collections.sort(mAppInfos, new Comparator<AppInfo>() { @Override public int compare(AppInfo o1, AppInfo o2) { return o1.getName().compareTo(o2.getName()); } }); // 添加字母索引 for (int i = 0; i < mAppInfos.size(); i++) { String section = mAppInfos.get(i).getFirstLetter(); if (!mSections.contains(section)) { mSections.add(section); } } // 设置适配器 AppAdapter adapter = new AppAdapter(); mListView.setAdapter(adapter); mListView.setDivider(null); // 设置字母索引 final String[] sections = new String[mSections.size()]; mSections.toArray(sections); ArrayAdapter<String> indexAdapter = new ArrayAdapter<>(this, R.layout.item_index, sections); ((IndexBar) findViewById(R.id.index_bar)).setIndexAdapter(indexAdapter); ((IndexBar) findViewById(R.id.index_bar)).setListView(mListView); } private class AppAdapter extends BaseAdapter implements SectionIndexer { private LayoutInflater mInflater; public AppAdapter() { mInflater = LayoutInflater.from(MainActivity.this); } @Override public int getCount() { return mAppInfos.size(); } @Override public Object getItem(int position) { return mAppInfos.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.item_app, parent, false); holder = new ViewHolder(); holder.iconView = convertView.findViewById(R.id.icon_view); holder.nameView = convertView.findViewById(R.id.name_view); holder.packageView = convertView.findViewById(R.id.package_view); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } AppInfo appInfo = mAppInfos.get(position); holder.iconView.setImageDrawable(getAppIcon(appInfo.getPackageName())); holder.nameView.setText(appInfo.getName()); holder.packageView.setText(appInfo.getPackageName()); return convertView; } @Override public Object[] getSections() { return mSections.toArray(new String[0]); } @Override public int getPositionForSection(int sectionIndex) { String section = mSections.get(sectionIndex); for (int i = 0; i < getCount(); i++) { String sortStr = mAppInfos.get(i).getFirstLetter(); if (sortStr.equals(section)) { return i; } } return -1; } @Override public int getSectionForPosition(int position) { return mSections.indexOf(mAppInfos.get(position).getFirstLetter()); } } private static class ViewHolder { ImageView iconView; TextView nameView; TextView packageView; } private Drawable getAppIcon(String packageName) { try { PackageManager pm = getPackageManager(); ApplicationInfo ai = pm.getApplicationInfo(packageName, 0); return pm.getApplicationIcon(ai); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return null; } private static class AppInfo { private String mName; private String mPackageName; public AppInfo(String name, String packageName) { mName = name; mPackageName = packageName; } public String getName() { return mName; } public String getPackageName() { return mPackageName; } public String getFirstLetter() { return mName.substring(0, 1); } } } ``` 该代码实现了以下功能: 1. 获取设备上已安装应用程序的包名和名称,并将其添加到一个列表中。 2. 对应用程序列表按照名称首字母进行排序。 3. 添加字母索引,即在列表右侧添加一个字母条,点击字母条上的字母,可以快速滚动到该字母开头的应用程序。 4. 将应用程序列表显示在ListView中,并使用自定义适配器进行展示。 需要注意的是,该代码中使用了ViewHolder模式来优化ListView的性能。此外,我们还需要自定义一个AppInfo类来存储应用程序的名称、包名和首字母信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值