【问题标题】:How to sort a listview in alphabetical order如何按字母顺序对列表视图进行排序
【发布时间】:2015-05-04 15:02:13
【问题描述】:

我一直在关注本教程here,了解如何制作自己的 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);
        }
    });
}

【问题讨论】:

    标签: java android sorting android-listview android-adapter


    【解决方案1】:

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

    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)'
    • 我假设AppDetail.nameString
    • 好的,谢谢它有效。但是我搞砸了,你能再帮我一次吗?而不是 a1.name 和 a2.name 我需要它是 a1.label 和 a2.label。然而 AppDetail.label 是一个 CharSequence。我可以这样排序还是必须先将其转换为字符串?
    • 它有效!非常感谢帮忙。我希望你能找到走出矩阵的路:)
    【解决方案2】:

    在将您的apps List 放入ArrayAdapterusing Collections.sort() 之前对其进行排序。

    【讨论】:

    • ArrayAdapter.sort() 怎么样?
    • @Blackbelt 你能举个例子吗?
    • @Blackbelt:你知道,我从来没有注意到这种方法。它在幕后使用Collections.sort(),尽管查看源代码我认为行为会有所不同,具体取决于是否应用了过滤器。如果您需要即时排序,这似乎是一种选择。对于按排序顺序开始的列表,我仍然会在将其放入 ArrayAdapter 之前将其添加到 sort()。很抱歉没有注意到这个选项!
    • 没有理由道歉。我同意您在将数据集提交给适配器之前对其进行排序
    【解决方案3】:
    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);
                                    }
    
                                });
    
                    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多