2013-10-30 22 views
15

Quindi sto cercando di ordinare un listview di arrayadapter semplice. Ecco cosa ho provato:Elenco di ordinamento Android in ordine alfabetico

ListView lv; 
String[] months = { 
     "January", 
     "February", 
     "March", 
     "April", 
     "May", 
     "June", 
     "July", 
     "August", 
     "September", 
     "October", 
     "November", 
     "December" 
}; 

ArrayAdapter<String> adapter; 
ArrayList<String> list; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    lv = (ListView)findViewById (R.id.listView1); 
    lv.setFastScrollEnabled(true); 
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, months); 
    lv.setAdapter(adapter); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // TODO Auto-generated method stub 

    switch (item.getItemId()) { 
    case R.id.sortasc: 
     list = new ArrayList<String>(Arrays.asList(months)); 
     Collections.sort(list); 
     for(int i=0; i < list.size(); i++){ 
      System.out.println(list.get(i)); 
     } 
     adapter.clear(); 
     adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, list); 
     adapter.notifyDataSetChanged(); 
     return true; 
    case R.id.sortdesc: 

     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

Ma sto diventando UnsupportedOperationException, cosa c'è di sbagliato in questo? Ho davvero bisogno di aiuto. Grazie in anticipo!

risposta

18

Non hai chiamato setAdapter (adattatore), dopo aver ordinato i tuoi articoli.

Usa come qui di seguito

adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, list); 
lv.setAdapter(adapter); 
adapter.notifyDataSetChanged(); 

invece di

adapter.clear(); // Useless 
adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, list); 
adapter.notifyDataSetChanged(); 
+0

questo mi aiuta, il mio male ho dimenticato di chiamare il metodo setAdapter – Dunkey

+1

Penso che non è necessario ricreare e utilizzare setAdapter ogni volta ... basta aggiornare l'origine (mesi array) e chiamare adapter.notifyDatasetChanged(); –

+0

@ umair.ali Se cambi l'istanza di Adapter devi sempre chiamare 'setAdapter'. Prima dovresti verificare al tuo fianco ... –

2
  1. Ordina il tuo array.
  2. Ricrea adattatore.
  3. Applica adattatore a listview.
+0

ho aggiornato il mio codice, ma ancora senza alcun risultato. Sta ancora ottenendo la stessa eccezione. – Dunkey

+0

post your logcat –

+0

Sto cercando di estendere il mio baseadapter in questo momento, dargli alcuni metodi di ordinamento standard e farlo notificare. Dovrebbe essere divertente, anche se non sono sicuro che funzionerà. –

1

per ordinare un elenco, è necessario utilizzare un Comparator. È necessario ordinare le raccolte sottostanti utilizzando un comparatore che esegue l'ordinamento alfabetico e quindi avvisare l'elenco per aggiornarsi.

Ecco un esempio di fare questo con un ArrayAdapter: https://stackoverflow.com/a/8920348/1369222

13

Ecco il trucco ...

private void sortAscending() { 
    List<String> sortedMonthsList = Arrays.asList(months); 
    Collections.sort(sortedMonthsList); 

    months = (String[]) sortedMonthsList.toArray(); 
} 

E per SortAscending, chiamano

sortAscending(); 
adapter.notifyDatasetChanged(); 

Allo stesso modo, è possibile implementare custom Comparator per ordinare anche in ordine decrescente ...

Spero che questo aiuti ... :)

+1

grazie amico! Questo aiuta anche. – Dunkey

8
Comparator<String> ALPHABETICAL_ORDER1 = new Comparator<String>() { 
    public int compare(String object1, String object2) { 
     int res = String.CASE_INSENSITIVE_ORDER.compare(object1.toString(), object2.toString()); 
     return res; 
    } 
}; 

Collections.sort(your array name, ALPHABETICAL_ORDER1); 
3

Android sorta ListView in ordine alfabetico.

listAdapter = new AppsAdapter(MainActivity.this,R.layout.content_layout,appList); 
     final Collator col = Collator.getInstance(); 
     listAdapter.sort(new Comparator<ApplicationInfo>() { 
      @Override 
      public int compare(ApplicationInfo lhs, ApplicationInfo rhs) { 
       return col.compare(lhs.loadLabel(packageManager),rhs.loadLabel(packageManager)); 
      } 
     }); 
+0

cosa è il 'packgeManager' per favore? –

0

sua semplice se si dispone già di un altro adattatore solo è possibile copiare incollare questo codice sotto dichiarazione di adattatore

adapter.sort(new Comparator<String>() { 
     @Override 
     public int compare(String arg1, String arg0) { 
      return arg1.compareTo(arg0); 
     } 
    }); 
Problemi correlati