Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Tratando de filtrar un ListView con runQueryOnBackgroundThread pero no pasa nada – ¿qué me falta?

Tengo una lista de países en una base de datos. He creado una actividad de país seleccionada que consiste en un cuadro de edición para filtrar y una lista que muestra la bandera y el nombre del país.

Cuando se inicia la actividad, la lista muestra la lista completa de países ordenados alfabéticamente – funciona bien. Cuando el cliente empieza a escribir en el cuadro de búsqueda, quiero que la lista se filtre en función de su tipo. Mi consulta de base de datos estaba trabajando anteriormente en un AutoCompleteView (sólo quiero cambiar a un cuadro de texto y una lista separados), así que sé que mi consulta completa y mi consulta de restricciones están funcionando. Lo que hice fue añadir un TextWatcher a la vista EditText y cada vez que se cambia el texto, invoco el método simpleCursorAdapter runQueryOnBackgroundThread de la lista con el texto de los cuadros de edición como restricción. El problema es que la lista nunca se actualiza. He fijado puntos de interrupción en el depurador y el TextWatcher hace la llamada a runQueryOnBackgroundThread y mi FilterQueryProvider se llama con la restricción prevista. La consulta de base de datos va bien y el cursor se devuelve.

  • El ListView de fondo se vuelve negro al desplazarse
  • Android - Animación al eliminar elementos de ListView
  • Android: cambia dinámicamente la imagen en Listview
  • ¿Cómo cargar datos del servidor al listview cuando se desplaza?
  • ¿Cómo puedo usar un listview sin extender ListActivity en mi clase?
  • Llamar al método setEmpty de ListView no funciona (no se muestra nada cuando la lista está vacía)
  • El adaptador de cursor tiene un proveedor de consulta de filtro establecido (y un enlace de vista para mostrar el indicador):

    SimpleCursorAdapter adapter = new SimpleCursorAdapter (this, R.layout.country_list_row, countryCursor, from, to); adapter.setFilterQueryProvider (new CountryFilterProvider ()); adapter.setViewBinder (new FlagViewBinder ()); 

    El FitlerQueryProvider:

     private final class CountryFilterProvider implements FilterQueryProvider { @Override public Cursor runQuery (CharSequence constraint) { Cursor countryCursor = myDbHelper.getCountryList (constraint); startManagingCursor (countryCursor); return countryCursor; } } 

    Y el EditText tiene un TextWatcher:

      myCountrySearchText = (EditText)findViewById (R.id.entry); myCountrySearchText.setHint (R.string.country_hint); myCountrySearchText.addTextChangedListener (new TextWatcher() { @Override public void afterTextChanged (Editable s) { SimpleCursorAdapter filterAdapter = (SimpleCursorAdapter)myCountryList.getAdapter (); filterAdapter.runQueryOnBackgroundThread (s.toString ()); } @Override public void onTextChanged (CharSequence s, int start, int before, int count) { // no work to do } @Override public void beforeTextChanged (CharSequence s, int start, int count, int after) { // no work to do } }); 

    La consulta de la base de datos tiene este aspecto:

     public Cursor getCountryList (CharSequence constraint) { if (constraint == null || constraint.length () == 0) { // Return the full list of countries return myDataBase.query (DATABASE_COUNTRY_TABLE, new String[] { KEY_ROWID, KEY_COUNTRYNAME, KEY_COUNTRYCODE }, null, null, null, null, KEY_COUNTRYNAME); } else { // Return a list of countries who's name contains the passed in constraint return myDataBase.query (DATABASE_COUNTRY_TABLE, new String[] { KEY_ROWID, KEY_COUNTRYNAME, KEY_COUNTRYCODE }, "Country like '%" + constraint.toString () + "%'", null, null, null, "CASE WHEN Country like '" + constraint.toString () + "%' THEN 0 ELSE 1 END, Country"); } } 

    Parece que hay un eslabón perdido en alguna parte. Cualquier ayuda sería apreciada.

    Gracias,

    Ian

  • ¿Cómo puedo fijar el color de fondo diferente para cada fila en listview?
  • UIAutomator haga clic en la vista de lista basada en el índice
  • Listview, abra una nueva actividad onClick
  • Creación de un RecyclerView ampliable
  • Cantidad total de elementos de lista en un ListView
  • ¿Utilizar un ListView para crear una pantalla de configuración en Android?
  • 2 Solutions collect form web for “Tratando de filtrar un ListView con runQueryOnBackgroundThread pero no pasa nada – ¿qué me falta?”

    Parece que estás haciendo mucho trabajo por algo que ya está integrado en Android. Echa un vistazo al cuadro de diálogo de búsqueda de Android en http://developer.android.com/guide/topics/search/search-dialog.html , y debería ser muy fácil para ti.

    Vi que se las arregló para resolver su problema de otra manera, pero pensé que debería añadir la respuesta de otras personas tropezar con esta cuestión.

    RunQueryOnBackgroundThread () sólo es responsable de ejecutar una consulta para una restricción y devolver un Cursor. Para poder filtrar el adaptador basado en el cursor necesitas hacer algo como

     filterAdapter.getFilter().filter(s.toString()); 

    Un CursorAdapter siempre implementa Filterable por defecto, y todo lo que implementa filterable se puede filtrar usando

      GetFilter (). Filter (restricción) 

    La forma en que el CursorAdapters construido en el filtro funciona es que si se sobrepone a runQueryOnBackgroundThread () o si se utiliza setFilterQueryProvider () entonces se ejecuta ese código en un subproceso de fondo, obtiene un nuevo cursor y lo establece como el cursor de CursorAdapter.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.