2012-07-16 17 views
5

Ho un MultiAutoCompleteTextView che consente di inserire più voci e mostra suggerimenti di completamento automatico. Il mio problema sorge quando invio i miei dati. Sto aggiungendo qualsiasi stringa inserita nell'elenco a discesa, ma i miei tentativi di ordinare i dati falliscono. Il codice che viene eseguito su conferma:Ordinamento di ArrayAdapter per Android

final private Comparator<String> comp = new Comparator<String>() { 
    public int compare(String e1, String e2) { 
     return e1.toString().compareTo(e2.toString()); 
    } 
}; 

((ArrayAdapter<String>) autoCompleteView.getAdapter()).add(getString());      
((ArrayAdapter<String>) autoCompleteView.getAdapter()).sort(comp); 

Il codice di ciò che accade sul cliccando l'autoCompleteView:

 view.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       adapter.getFilter().filter(null); 
       //adapter.sort(comp); 
       view.showDropDown(); 
      } 
     }); 

chiunque può trovare qualcosa di sbagliato in quello che sto facendo?

EDIT: un po 'di informazioni, dopo che incorpora le modifiche da @ Sam

private ArrayList<String> array = new ArrayList<String>(); 
private ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, 
     array); 

private void setUpAutoComplete(final MultiAutoCompleteTextView view) 
{ 
    array.add("test string"); // this is successfully added to the drop down list 
    Collections.sort(array, comp); 
    adapter.notifyDataSetChanged(); 
} 

private void onSubmit() 
{ 
    array.add(getString()); // this fails to add 
    adapter.notifyDataSetChanged(); 
} 

risposta

9

ma i miei tentativi di ordinare i dati sicuro

Questo è un po' vago. Ma farò una supposizione.

Per prima cosa è fare qualcosa ridondante:

return e1.toString().compareTo(e2.toString()); 

Dal e1 e e2 sono già stringhe non è necessario chiamare String#toString(). Anche questo comparatore di stringhe di base esiste già. Quindi non hai bisogno di questo.

Una tecnica migliore è ordinare l'elenco, non l'adattatore. È sufficiente utilizzare il metodo di ordinamento delle collezioni:

List<String> list = new ArrayList<String>(); 
list.add(getString()); 
... 

Collections.sort(list); 
adapter.notifyDataSetChanged(); 

Avviso ho cambiato adapter.add()-list.add(). L'ho fatto perché adapter.add() chiama list.add()eadapter.notifyDataSetChanged() ma l'adattatore non deve essere aggiornato fino a dopo il il nuovo elenco è ordinato.

+0

Grazie. Ho aggiunto questo codice alla parte che viene eseguita quando invio, ma l'elenco a discesa non si aggiorna affatto con la nuova voce. Quando aggiungo il codice nella parte in cui l'adattatore è inizializzato, tuttavia, la stringa aggiunta è stata aggiunta con successo. Sembra che questo sia un problema con (thread) che non è in grado di modificare i dati esistenti? – Flash

+1

Non vedo dove si stanno utilizzando i thread o il contesto generale, quindi non posso essere certo ... – Sam

+0

Siamo spiacenti, per favore vedi la mia modifica della domanda originale. – Flash

Problemi correlati