2011-09-17 21 views
13

Tengo un AutoCompleteTextView en mi diseño. También tengo una forma alternativa de seleccionar los mismos elementos que están presentes en AutoCompleteTextView. Cuando se selecciona el modo alternativo, que pueblan el valor en el AutoCompleteTextView a través de:¿Cómo puedo evitar que aparezca el menú desplegable de autocompletar cuando el texto está programado?

autoCompleteTextView.setText(valueFromAlternativeSource); 

donde valueFromAlternativeSource es una de las opciones de auto completo válido. El problema con esto es que aparece el menú desplegable Autocompletar cuando se llama a setText. Poniendo la siguiente línea después de que el anterior no funciona:

autoCompleteTextView.dismissDropDown(); //Doesn't work. Why? 

¿Alguna idea de por qué descartar desplegable no está funcionando u otras formas que podrían descartar el menú desplegable?

+1

Su solución no funciona porque el método setText (CharSequence) comienza el trabajo asíncrono. Cada vez que el texto cambia, el filtro del adaptador se utiliza para filtrar las posibles propuestas para mostrar. Dado que el filtro puede llevar mucho tiempo, se lo llama de forma asincrónica. Algún tiempo después, el filtro vuelve y sus resultados se muestran cuando el subproceso de la interfaz de usuario vuelve a procesar el tiempo. En este momento, el método dismissDropDown() se ha completado hace mucho tiempo, razón por la cual este método no tiene ningún efecto en absoluto. " Fuente: http://www.grokkingandroid.com/how-androids-autocompletetextview-nearly-drove-me -nuts/ – Singed

Respuesta

2

Mi solución (pero no me gusta, algo tiene que haber mejor):

autoCompleteTextView.setText(valueFromAlternativeSource); 
autoCompleteTextView.setDropDownHeight(0); 

autoCompleteTextView.setOnKeyListener(new OnKeyListener(){ 

    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     autoCompleteTextView.setDropDownHeight(LayoutParams.WRAP_CONTENT); 
    } 
} 
7

Parece que es un problema de la orden de cómo se procesan los mensajes. Mi trabajo alrededor se ve así:

//autoCompleteTextView.dismissDropDown(); 
new Handler().post(new Runnable() { 
    public void run() { 
     autoCompleteTextView.dismissDropDown(); 
}}); 
9

Esto funciona muy bien para mí y es menos complejo:

ListAdapter adapter = autoCompleteTextView.getAdapter(); 
autoCompleteTextView.setAdapter(null); 
autoCompleteTextView.setText("whatever"); 
autoCompleteTextView.setAdapter(adapter); 
2
autoCompleteTextView.setText(valueFromOtherMeans, filter); 

    * @param filter If <code>false</code>, no filtering will be performed 
    *  as a result of this call. 
+0

Sería bueno si agregas un poco de prosa a tu respuesta – faceman

+2

Solo funciona para API 17+, por cierto –

+0

@faceman ¿por qué no hacer un poco de tarea? – drindt

7

Si quieres apoyar API < 17, Subclase AutoCompleteTextView y anular setText(text, filter) método

@Override 
public void setText(CharSequence text, boolean filter) { 
    if(Build.VERSION.SDK_INT>=17) { 
     super.setText(text, filter); 
    }else{ 
     if(filter){ 
      setText(text); 
     }else{ 
      ListAdapter adapter = getAdapter(); 
      setAdapter(null); 
      setText(text); 
      if(adapter instanceof ArrayAdapter) 
       setAdapter((ArrayAdapter) adapter); 
      else 
       setAdapter((CursorAdapter) adapter); 
      //if you use more types of Adapter you can list them here 
     } 
    } 
} 

A continuación, cada vez que desee establecer el texto de llamada manualmente setText(text, false)

+0

¡La mejor respuesta aquí solo para la compatibilidad API <17! – Petro

+0

No seguro de por qué esta no es la respuesta aceptada. – northernman

Cuestiones relacionadas