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!

One Solution collect form web for “ListView, SimpleCursorAdapter, un filtro de EditText – ¿por qué no hace nada?”

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.