Pregunta ListView, SimpleCursorAdapter, un filtro EditText - ¿por qué no hará nada?


Me gustaría filtrar un ListView SimpleCursorAdapter-driven con un cuadro EditText justo encima de él. Tengo el siguiente código, pero cuando escribo en el cuadro, no pasa nada; la lista completa sigue apareciendo. ¿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 probado todos los ejemplos y respuestas que he encontrado en mis búsquedas, pero fue en vano. Es frustrante, como te puedes imaginar. Gracias de antemano por cualquier persona que pueda ayudar!


23
2018-03-16 07:56


origen


Respuestas:


Pruebe de esta manera:

}  else  {
    String value = "%"+constraint.toString()+"%";

    return mDB.query(directoryPeople.PEOPLE_TABLE, asColumnsToReturn, "LAST_NAME like ? ", new String[]{value}, null, null, null);
}

Me salté el último argumento porque no sé lo que 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?


15
2018-03-16 08:45