2012-07-16 30 views
5

Tengo un MultiAutoCompleteTextView que le permite ingresar en varias entradas y muestra las sugerencias de autocompletar. Mi problema surge cuando envío mis datos. Estoy agregando cadenas ingresadas a la lista desplegable, pero mis intentos de ordenar los datos fallan. El código que se ejecuta en enviar:Ordenando ArrayAdapter para 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); 

el código de lo que sucede en hacer clic en el autoCompleteView:

 view.setOnClickListener(new OnClickListener() { 

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

¿Alguien puede encontrar nada malo en lo que estoy haciendo?

EDIT: algo más de información, después de incorporar cambios de @ 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(); 
} 

Respuesta

9

pero mis intentos para clasificar los datos fallan

Esto es un poco vago. Pero voy a adivinar.

En primer lugar, hacer algo redundante:

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

Desde e1 y e2 ya son cadenas que no es necesario llamar a String#toString(). También este comparador básico de cadenas ya existe. Entonces no necesitas nada de esto.

Una mejor técnica es ordenar la lista, no el adaptador. Sólo tiene que utilizar el método de clasificación colecciones:

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

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

Aviso cambié adapter.add()-list.add(). Lo hice porque adapter.add() llama a list.add()yadapter.notifyDataSetChanged() pero el adaptador no se debe actualizar hasta después de la nueva lista está ordenada.

+0

Gracias. He agregado este código a la parte que se ejecuta cuando envío, pero la lista desplegable no se actualiza en absoluto con la nueva entrada. Sin embargo, cuando agrego el código en la parte donde se inicializa el adaptador, la cadena agregada se agrega con éxito. ¿Esto suena como un problema con (hilos) que no puede modificar los datos existentes? – Flash

+1

No veo dónde está usando subprocesos o el contexto general, por lo que no puedo estar seguro ... – Sam

+0

Disculpe, vea mi edición de la pregunta original. – Flash

Cuestiones relacionadas