2012-07-16 14 views
5

Mam MultiAutoCompleteTextView, który umożliwia wpisywanie wielu wpisów i pokazuje autouzupełnianie sugestii. Mój problem powstaje, gdy przesyłam moje dane. Dodaję wszystkie wprowadzone ciągi do rozwijanej listy, ale moje próby posortowania danych zawodzą. Kod, który wykonuje na przedłożyć:Sortowanie ArrayAdapter dla Androida

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

kod dla co dzieje się na kliknięcie autoCompleteView:

 view.setOnClickListener(new OnClickListener() { 

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

Czy ktoś może znaleźć coś złego z tym, co robię?

EDIT: trochę więcej informacji, po uwzględnieniu zmian od @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(); 
} 

Odpowiedz

9

ale moje próby, aby posortować dane nie

To jest trochę niejasne. Ale zgaduję.

Najpierw trzeba coś zrobić nadmiarowe:

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

Od e1 i e2 są już strun nie trzeba zadzwonić String#toString(). Również ten podstawowy komparator String już istnieje. Więc nie potrzebujesz tego.

Lepszą techniką jest sortowanie listy, a nie adaptera. Wystarczy użyć metody sortowania kolekcjach:

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

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

Zawiadomienie Zmieniłem adapter.add() do list.add(). Zrobiłem to, ponieważ adapter.add() dzwonii krupie, ale adapter nie powinien być aktualizowany, dopóki nie zostanie posortowana nowa lista.

+0

Dzięki. Dodałem ten kod do części, która wykonuje się po przesłaniu, ale lista rozwijana nie aktualizuje się w ogóle o nowy wpis. Kiedy dodaję kod do części, w której jest zainicjalizowany adapter, dodany łańcuch został pomyślnie dodany. Czy to brzmi jak problem z (wątkami), który nie może modyfikować istniejących danych? – Flash

+1

Nie widzę, gdzie używasz wątków lub ogólnego kontekstu, więc nie mogę być pewny ... – Sam

+0

Przepraszam, zapoznaj się z moją wersją oryginalnego pytania. – Flash