如何对ListView进行按字母顺序排序

4

我一直在跟随这篇教程(链接)来制作自己的Android启动器。我现在能够在列表视图中显示手机上安装的所有应用程序。如何编辑此代码以使列表按字母顺序排列?

    protected void onCreate(Bundle savedInstanceState) {    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_apps_list);

        loadApps();
        loadListView();
        addClickListener();
    }

private PackageManager manager;
private List<AppDetail> apps; 
private void loadApps(){
    manager = getPackageManager();
    apps = new ArrayList<AppDetail>();

    Intent i = new Intent(Intent.ACTION_MAIN, null);
    i.addCategory(Intent.CATEGORY_LAUNCHER);

    List<ResolveInfo> availableActivities = manager.queryIntentActivities(i, 0);
    for(ResolveInfo ri:availableActivities){
        AppDetail app = new AppDetail();
        app.label = ri.loadLabel(manager);
        app.name = ri.activityInfo.packageName;
        app.icon = ri.activityInfo.loadIcon(manager);
        apps.add(app);
    }
}

private ListView list;    
private void loadListView(){
    list = (ListView)findViewById(R.id.apps_list);

    ArrayAdapter<AppDetail> adapter = new ArrayAdapter<AppDetail>(this, 
            R.layout.list_item, 
            apps) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if(convertView == null){
                convertView = getLayoutInflater().inflate(R.layout.list_item, null);
            }

            ImageView appIcon = (ImageView)convertView.findViewById(R.id.item_app_icon);
            appIcon.setImageDrawable(apps.get(position).icon);

            TextView appLabel = (TextView)convertView.findViewById(R.id.item_app_label);
            appLabel.setText(apps.get(position).label);

            TextView appName = (TextView)convertView.findViewById(R.id.item_app_name);
            appName.setText(apps.get(position).name);

            return convertView;
        }
    };

    list.setAdapter(adapter);           
}

private void addClickListener(){        
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> av, View v, int pos,
                long id) {
            Intent i = manager.getLaunchIntentForPackage(apps.get(pos).name.toString());
            AppsListActivity.this.startActivity(i);
        }
    });
}
3个回答

7

虽然第一个答案是正确且最明显的方法,但我认为需要一个完整的示例:

Collections.sort(apps, new Comparator<AppDetail>() {

    /* This comparator will sort AppDetail objects alphabetically. */

    @Override
    public int compare(AppDetail a1, AppDetail a2) {

        // String implements Comparable
        return (a1.label.toString()).compareTo(a2.label.toString());
    }
});

这将按照它们的 label 字段,对 AppDetail 对象进行字母排序。

在调用 setAdapter() 之前,请先执行此操作。


我在compareTo处遇到错误,显示无法解析方法“compareTo(Java.Lang.CharSequence)”。 - user1353517
我假设 AppDetail.name 是一个 String - Yash Sampat
好的,谢谢,它有效。但是我搞砸了,你能再帮我一次吗?我需要的不是a1.name和a2.name,而是a1.label和a2.label。然而,AppDetail.label是一个CharSequence。我可以这样排序吗,还是我需要先将其转换为字符串? - user1353517
它运行了!非常感谢您的帮助。我希望您能找到走出矩阵的方法 :) - user1353517

4

在将apps List放入ArrayAdapter之前,请使用Collections.sort()对其进行排序。


1
ArrayAdapter.sort()怎么样? - Blackbelt
@Blackbelt,你能发一个例子吗? - user1353517
@Blackbelt:你知道吗,我从来没注意过那个方法。它在底层使用了 Collections.sort(),不过看源码的时候我觉得行为会有所不同,这取决于是否应用了过滤器。如果你需要动态排序,它肯定是一个不错的选择。但如果列表一开始就是有序的,我还是会在把它放进 ArrayAdapter 之前进行 sort()。很抱歉我没有注意到这个选项! - CommonsWare
不用道歉。我同意你关于在提交数据集到适配器之前进行排序的观点。 - Blackbelt

2
Collections.sort(contactList,
                            new Comparator<Map<String, String>>() {

                                @Override
                                public int compare(Map<String, String> o1,
                                        Map<String, String> o2) {
                                    // TODO Auto-generated method stub
                                    String name1 = o1.get("name");
                                    String name2 = o2.get("name");
                                    if (name1 == null)
                                        return -1;
                                    return name1.compareTo(name2);
                                }

                            });

                }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接