2011-01-05 17 views
5

Para mi AutoCompleteTextView Tengo que buscar los datos de un servicio web. Como puede llevar un poco de tiempo, no quiero que el subproceso de la interfaz de usuario no responda, así que de alguna manera debo buscar los datos en un hilo separado. Por ejemplo, mientras recupera datos de SQLite DB, es muy fácil hacerlo con el método CursorAdapter - runQueryOnBackgroundThread. Estaba buscando otros adaptadores como ArrayAdapter, BaseAdapter, pero no encontré nada similar ...Recuperar AutocompletarTextoVer sugerencias del servicio en el hilo separado

¿Hay alguna manera fácil de lograrlo? No puedo simplemente uso ArrayAdapter directamente, ya que la lista de sugerencias es dinámico - Siempre buscar a la lista de sugerencias en función de la entrada del usuario, por lo que no puede ser pre-rebuscado y en caché para su uso posterior ...

Si alguien puede dar algunos consejos o ejemplos sobre este tema, ¡sería genial!

Respuesta

9

EDITADO: Se agregó una forma ingenua de evitar el menú desplegable que se muestra al hacer clic en una sugerencia.

que hacer algo como esto en mi aplicación:

private AutoCompleteTextView mSearchbar; 
private ArrayAdapter<String> mAutoCompleteAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    mAutoCompleteAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line); 
    mSearchbar = (AutoCompleteTextView) findViewById(R.id.searchbar); 
    mSearchbar.setThreshold(3); 
    mSearchbar.setAdapter(mAutoCompleteAdapter); 
    mSearchbar.addTextChangedListener(new TextWatcher() { 

     private boolean shouldAutoComplete = true; 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      shouldAutoComplete = true; 
      for (int position = 0; position < mAutoCompleteAdapter.getCount(); position++) { 
       if (mAutoCompleteAdapter.getItem(position).equalsIgnoreCase(s.toString())) { 
        shouldAutoComplete = false; 
        break; 
       } 
      } 

     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      if (shouldAutoComplete) { 
       new DoAutoCompleteSearch().execute(s.toString()); 
      } 
     } 
    } 
} 

private class DoAutoCompleteSearch extends AsyncTask<String, Void, ArrayList<String>> { 
    @Override 
    protected ArrayList<String> doInBackground(String... params) { 
     ArrayList<String> autoComplete = new ArrayList<String>(); 
     //do autocomplete search and stuff. 
     return autoComplete; 
    } 

    @Override 
    protected void onPostExecute(ArrayList<String> result) { 
     mAutoCompleteAdapter.clear(); 
     for (String s : result) 
      mAutoCompleteAdapter.add(s); 
    } 
} 
+0

esta solución tiene algún problema en mi caso, el menú desplegable no aparece hasta que presiono la tecla 'borrar' en la placa de teclas programables para eliminar el texto escrito, está tan conectado. – Longerian

+0

¡Esto realmente me ayudó mucho! ¡Gracias! – ymerdrengene

1

tenían la misma solución, excepto que el problema es que todo está bien (las variables se actualizan cuando elimino errores), pero la función de autocompletar llena extrañamente como en

cuando escribo sco tiene los resultados pero no se muestra en la lista pero cuando retrocedo, muestra el resultado para sco. En la depuración, todas las variables se actualizan y solo me dice que la interfaz de usuario no se está actualizando para AutoCompleteTextView. como cuando retrocedo se activa para la actualización y luego muestra la lista de la computadora anterior, entonces (mientras tanto, la actualiza con los nuevos elementos de la lista para una nueva cadena de búsqueda. ¿alguien se encontró con este problema?

10

Con el enfoque encima, también tuve esos problemas cuando escribo muy rápido. Supongo que es porque el filtro de los resultados se realiza de forma asincrónica por la clase de filtro, por lo que puede haber problemas al modificar ArrayList del adaptador en el subproceso ui mientras se filtra hecho.

http://developer.android.com/reference/android/widget/Filter.html

Sin embargo, con enfoque siguiente todo funcionaba bien.

+0

Al anular todos los métodos básicos y usar su propia estructura de datos (mSubData), ha perdido el beneficio de la creación de subclases, incluida la seguridad de subprocesos que la superclase garantiza para los datos. Simplemente use los métodos add()/addAll()/clear() de la superclase. Ellos también notificarán automáticamente a los oyentes. Y conservarás la seguridad del hilo. – Risadinha

Cuestiones relacionadas