ListView, SimpleCursorAdapter, un filtro de EditText – ¿por qué no hace nada?

Me gustaría filtrar un ListView de SimpleCursorAdapter-driven con un cuadro EditText justo encima de él. Tengo el código siguiente, pero cuando mecanografío en el rectángulo, nada sucede; La lista completa continúa mostrándose. ¿Qué estoy haciendo mal?

mCursor = getDirectoryList(null); adapter = new SimpleCursorAdapter(this, R.layout.directory_people_item, mCursor, new String[]{ directoryPeople.LAST_NAME, directoryPeople.FIRST_NAME, directoryPeople.MIDDLE_NAME, directoryPeople.JOB_TITLE}, new int[]{ R.id.txtLastName, R.id.txtFirstName, R.id.txtMiddle, R.id.txtTitle} ); ListView av = (ListView)findViewById(R.id.listPeople); av.setAdapter(adapter); av.setFastScrollEnabled(true); av.setTextFilterEnabled(true); EditText etext=(EditText)findViewById(R.id.search_box); etext.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence s, int start, int before, int count) { } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void afterTextChanged(Editable s) { ListView av = (ListView)findViewById(R.id.listPeople); SimpleCursorAdapter filterAdapter = (SimpleCursorAdapter)av.getAdapter(); filterAdapter.getFilter().filter(s.toString()); } }); adapter.setFilterQueryProvider(new FilterQueryProvider() { public Cursor runQuery(CharSequence constraint) { return getDirectoryList(constraint); } }); 

Y aquí está getDirectoryList() :

 public Cursor getDirectoryList (CharSequence constraint) { SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); queryBuilder.setTables( directoryPeople.PEOPLE_TABLE ); String asColumnsToReturn[] = { directoryPeople.PEOPLE_TABLE + "." + directoryPeople.LAST_NAME + "," + directoryPeople.PEOPLE_TABLE + "." + directoryPeople.FIRST_NAME + "," + directoryPeople.PEOPLE_TABLE + "." + directoryPeople.MIDDLE_NAME + "," + directoryPeople.PEOPLE_TABLE + "." + directoryPeople.JOB_TITLE + "," + directoryPeople.PEOPLE_TABLE + "." + directoryPeople._ID }; if (constraint == null || constraint.length () == 0) { // Return the full list return queryBuilder.query(mDB, asColumnsToReturn, null, null, null, null, directoryPeople.DEFAULT_SORT_ORDER); } else { return mDB.query(directoryPeople.PEOPLE_TABLE, asColumnsToReturn, "LAST_NAME like '%'" + constraint.toString() + "'%'", null, null, null, "CASE WHEN LAST_NAME like '" + constraint.toString() + "%' THEN 0 ELSE 1 END, LAST_NAME"); } } 

He intentado cada ejemplo y respuesta que he encontrado en mis búsquedas, pero en vano. Es frustrante, como se puede imaginar. Gracias de antemano por cualquier persona que pueda ayudar!

Prueba de esta manera:

 } else { String value = "%"+constraint.toString()+"%"; return mDB.query(directoryPeople.PEOPLE_TABLE, asColumnsToReturn, "LAST_NAME like ? ", new String[]{value}, null, null, null); } 

Salté el último argumento porque no sé lo que realmente debería hacer:

 "CASE WHEN LAST_NAME like '" + constraint.toString() + "%' THEN 0 ELSE 1 END, LAST_NAME" 

¿Has probado esta consulta en shell en el emulador?

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