2015-03-03 3 views
3

Я следую этому руководству 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); 
     } 
    }); 
} 

ответ

6

Хотя первый ответ правильный и самый очевидный способ сделать это, я считаю, ответ требует полного примера:

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

Это будет сортировать AppDetail объектов в алфавитном порядке по их label полю.

Сделайте это до звонка setAdapter().

+0

Я получаю сообщение об ошибке по сравнению Сказанное не может решить метод 'compareTo (Java.Lang.CharSequence)' – user1353517

+0

Я предположил, что 'AppDetail.name' является' String ' –

+0

Хорошо, спасибо, что работает. Но я перепутал, не могли бы вы помочь мне снова? вместо a1.name и a2.name мне нужно, чтобы это были a1.label и a2.label. Однако AppDetail.label является CharSequence. Могу ли я сортировать его так, или мне нужно сначала преобразовать его в строку? – user1353517

4

Сортируйте appsList, прежде чем положить его в ArrayAdapter, using Collections.sort().

+1

Что касается ArrayAdapter.sort()? – Blackbelt

+0

@Blackbelt не могли бы вы привести пример? – user1353517

+0

@Blackbelt: Знаешь, я никогда не замечал этого метода. Он использует 'Collections.sort()' под обложками, хотя, глядя на источник, я думаю, что поведение меняется немного в зависимости от того, применяется ли фильтр. Это, безусловно, похоже на вариант, если вам нужно будет сортировать «на лету». Для списка, который начинается в отсортированном порядке, я все равно 'sort()' его перед тем, как поместить его в 'ArrayAdapter'. Приношу извинения за то, что я не заметил этого варианта! – CommonsWare

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

          }); 

       } 
Смежные вопросы