Java – How to sort a ListView alphabetically

How to sort a ListView alphabetically… here is a solution to the problem.

How to sort a ListView alphabetically

I’ve been working on this tutorial here About how to make my own Android launcher. I can currently display all the installed apps on my phone in the ListView. How do I edit this code to make the list alphabetical?

    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);
        }
    });
}

Solution

While the first answer is the correct and most obvious method, I believe the answer needs a complete example:

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());
    }
});

This sorts the AppDetail objects alphabetically by label field.

Do this before calling setAdapter().

Related Problems and Solutions