2010-10-17 12 views
7

¿Cómo se obtiene la sugerencia superior actual en un AutoCompleteTextView? Lo sugiero artículos, y tengo un oyente de cambio de texto registrado. También tengo una lista en la misma pantalla. Mientras escriben, quiero desplazar la lista a la "mejor" sugerencia actual. Pero no puedo entender cómo acceder a las sugerencias actuales, o al menos a la sugerencia principal. Creo que estoy buscando algo como AutoCompleteTextView.getCurrentSuggestions():Obteniendo la sugerencia actual de `AutoCompleteTextView`

autoCompleteTextView.addTextChangedListener(new TextWatcher() { 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
      String currentText = autoCompleteTextView.getText(); 
      String bestGuess = autoCompleteTextView.getCurrentSuggestions()[0]; 
      //          ^^^ mewthod doesn't exist 
      doSomethingWithGuess(bestGuess); 
     } 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // do nothing 
     } 
     public void afterTextChanged(Editable s) { 
      // do nothing 
     } 
    }); 

Respuesta

15

He hecho lo que quiere hacer con el siguiente código:

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

    adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_dropdown_item_1line, COUNTRIES); 
    AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.edit); 
    textView.setAdapter(adapter); 

    adapter.registerDataSetObserver(new DataSetObserver() { 
     @Override 
     public void onChanged() { 
      super.onChanged(); 
      Log.d(TAG, "dataset changed"); 
      Object item = adapter.getItem(0); 

      Log.d(TAG, "item.toString "+ item.toString()); 
     } 
    }); 
} 

item.toString imprimirá el texto que se muestra en el primer elemento.

Tenga en cuenta que esto sucederá incluso si aún no muestra la ventana emergente (sugerencias). Además, debe verificar si hay elementos que pasaron los criterios de filtro (también conocido como la entrada del usuario).

Para resolver el primer problema:

int dropDownAnchor = textView.getDropDownAnchor(); 
    if(dropDownAnchor==0) { 
     Log.d(TAG, "drop down id = 0"); // popup is not displayed 
     return; 
    } 
    //do stuff 

Para resolver el segundo problema, utilice getCount> 0

+0

¡Gran respuesta! Mucho mejor que mi hack a continuación. –

+0

Muchas gracias por esto. Intenté por unos días averiguar cómo cambiar dinámicamente la altura de mi menú desplegable en función de la cantidad de elementos filtrados y parecía filtrarse después del evento 'afterTextChanged'. El dataSetObserver fue exactamente el oyente que necesitaba para hacerlo funcionar – Mike

+0

¡Este es perfecto! –

1

AutoCompleteTextView no se desplaza hacia abajo a la mejor selección, pero se estrecha la selección a medida que escribe. Aquí hay un ejemplo de ello: http://developer.android.com/resources/tutorials/views/hello-autocomplete.html

Como yo lo veo desde AutoCompleteTextView no hay forma de obtener la lista actual de sugerencias.

La única forma parece ser escribir una versión personalizada de ArrayAdapter y pasarla a AutoCompleteTextView.setAdapter (..). Aquí está el source to ArrayAdapter. Sólo se debe cambiar un método en el ArrayFilter.performFiltering clase interna() para que se expone FilterResults:

.. añadir campo para interior ArrayFilter clase:

public ArrayList<T> lastResults; //add this line 

.. antes de final de performFiltering método:

lastResults = (ArrayList<T>) results; // add this line 
    return results; 
} 

su uso como esto (ejemplo adaptado de enlace):

AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete_country); 
CustomArrayAdapter<String> adapter = new CustomArrayAdapter<String>(this, R.layout.list_item, COUNTRIES); 
textView.setAdapter(adapter); 

// read suggestions 
ArrayList<String> suggestions = adapter.getFilter().lastResult; 
+0

i probar el código, pero en "lastResults = (ArrayList ) da como resultado", pero no podemos convertir un FilterResults escribe en ArrayList . – pengwang

+0

¿me puede decir cómo modificar? sdk2.2 – pengwang

+2

Mire la respuesta anterior: es la mejor solución que la mía;) –

Cuestiones relacionadas