>

Fórum

Fórum da RL System, voltado para analistas, programadores etc. Tudo sobre linguagem de programação e desenvolvimento Full Stack: Banco de Dados, Android, C#, Java, .NET, PHP, Node, Javascript, TypeScript, Front, HTML e muito mais.



Filtrar dados da listview com uso de sqlite e simplecursoradapter


Boa tarde!
Eu tenho uma listview, onde os dados do banco de dados é do SQLite e estou a usar o SimpleCursorAdapter.
Eu queria que o utilizador fosse capaz de digitar letras no EditText e a listview filtrar à medida que é digitada a palavra.
Infelizmente não estou a ter sorte, e peço ajuda!

ListarAluno.java


public class ListarAluno extends ListActivity {

ListAdapter adapter; //permite mostrar várias informações em uma linha do ListView
DBAdapter datasource; //permite fazer operações na base de dados

Button btCancelar;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listaraluno);

/////-/////-/////-/////
datasource = new DBAdapter(this);
datasource.open();
Cursor cursor = datasource.getObservations();

String[] columns = new String[]{"nome", "idade"};
int[] to = new int[]{R.id.nome, R.id.idade};

adapter = new SimpleCursorAdapter(
this,
R.layout.observation_list_item,
cursor,
columns,
to);
this.setListAdapter(adapter);
datasource.close();

/////-/////-/////-/////

/////-/////-/////-/////
ListView listView = (ListView) findViewById(android.R.id.list);
listView.setAdapter(adapter);
//listView.setFastScrollEnabled(true);
//enables filtering for the contents of the given ListView
//listView.setTextFilterEnabled(true);


EditText edtProcurar = (EditText) findViewById(R.id.edtProcurar);

edtProcurar.addTextChangedListener(new TextWatcher() {

public void afterTextChanged(Editable s) { }

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

public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s.toString());
}
});

adapter.setFilterQueryProvider(new FilterQueryProvider() {
public Cursor runQuery(CharSequence constraint) {
return datasource.getObservationsByNome(constraint.toString());
}
});

/////-/////-/////-/////

/////-/////-/////-/////
btCancelar = (Button) findViewById(R.id.btCancelar);

btCancelar.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
});
/////-/////-/////-/////
}

@Override
protected void onResume() {
super.onResume();

datasource.open();
Cursor cursor = datasource.getObservations();
String[] columns = new String[] { "nome","idade" };
int[] to = new int[] { R.id.nome, R.id.idade};
adapter = new SimpleCursorAdapter(
this,
R.layout.observation_list_item,
cursor,
columns,
to);
this.setListAdapter(adapter);
datasource.close();
}

// método que é chamado sempre que é clicado um item da lista
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Intent novo = new Intent(ListarAluno.this,EditarAluno.class);
Cursor cursor = (Cursor) adapter.getItem(position);
novo.putExtra("idObservation",cursor.getInt(cursor.getColumnIndex("_id")));
startActivity(novo);
}
}



21 Respostas


DBAdapter.java


public class DBAdapter {

private SQLiteDatabase database;
private DbHelper dbHelper;
private String[] allColumnsObservation = { DbHelper.ID, DbHelper.NOME, DbHelper.IDADE, DbHelper.SEXO, DbHelper.ESCOLA, DbHelper.OBSERVADOR, DbHelper.NES, DbHelper.FOTO };
//private String[] allColumnsaesObservation = { DbHelper.ID, DbHelper.NOME, DbHelper.SEXO, DbHelper.ESCOLA, DbHelper.OBSERVADOR, DbHelper.FOTO };
//private String[] allColumnsSession = { DbHelper.ID, DbHelper.OBSERVATION_ID, DbHelper.AESOBSERVATION_ID, DbHelper.DATA, DbHelper.HORA, DbHelper.NCRIANCAS, DbHelper.TOTALCRIANCAS, DbHelper.TOTALADULTOS, DbHelper.ATIVIDADE, DbHelper.NIVELINICIATIVA, DbHelper.NIVELENVOLVIMENTO, DbHelper.EXPERIENCIASAPRENDIZAGEM, DbHelper.GRUPO, DbHelper.INTERACAOUM, DbHelper.INTERACAODOIS, DbHelper.INTERACAOTRES, DbHelper.INTERACAOQUATRO };


public DBAdapter(Context context) {
dbHelper = new DbHelper(context);
}

public void open() throws SQLException {
database = dbHelper.getWritableDatabase();
}

public void close() {
dbHelper.close();
}

//Aluno
public Observation createObservation(String nome, String idade, String sexo, String escola, String observador, String nes, Bitmap foto){
ContentValues values = new ContentValues();
values.put(dbHelper.NOME, nome);
values.put(dbHelper.IDADE,idade);
values.put(dbHelper.SEXO,sexo);
values.put(dbHelper.ESCOLA,escola);
values.put(dbHelper.OBSERVADOR,observador);
values.put(dbHelper.NES,nes);

ByteArrayOutputStream baos = new ByteArrayOutputStream();
foto.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] photo = baos.toByteArray();

values.put(dbHelper.FOTO, photo);

long insertId = database.insert(dbHelper.TABLE_OBSERVATION, null, values);
// To show how to query
Cursor cursor = database.query(dbHelper.TABLE_OBSERVATION, allColumnsObservation, dbHelper.ID " = " insertId, null,null, null, null);
cursor.moveToFirst();
return cursorToObservation(cursor);

}

public void EliminaObservation (int idObservation){
//database.delete(DB.TABLE_NAME, "id=?", new String [] {Integer.toString(idContacto)});
database.delete(DbHelper.TABLE_OBSERVATION, DbHelper.ID " = " idObservation, null);
}


private Observation cursorToObservation(Cursor cursor) {
byte[] blob = cursor.getBlob(cursor.getColumnIndex(dbHelper.FOTO));
Bitmap bmp = BitmapFactory.decodeByteArray(blob, 0, blob.length);
Observation observation = new Observation(cursor.getLong(0),cursor.getString(1), cursor.getInt(2), cursor.getString(3), cursor.getString(4), cursor.getString(5), cursor.getString(6),bmp);
return observation;
}


public Cursor getObservations(){
Cursor cursor = database.rawQuery("select _id, foto, nome,idade from observation ORDER BY nome", null); //escola,observador
return cursor;
}


public Observation getObservation (int idObservation){
Cursor cursor = database.query(dbHelper.TABLE_OBSERVATION, allColumnsObservation, dbHelper.ID " = " idObservation, null, null, null, null);
cursor.moveToFirst();
return cursorToObservation(cursor);
}

public Cursor getObservationsByNome(String inputText){
Cursor cursor = database.query(dbHelper.TABLE_OBSERVATION, allColumnsObservation, dbHelper.NOME " like '%" inputText "%'" , null, null, null, null);
return cursor;
}
}




Boa tarde!
Alguém me pode ajudar?




Ola Cristiana

veja este topico aki

http://helpdev.com.br/2014/01/17/android-filtrando-dados-de-um-listview-com-um-edittext-how-to-filter-listview-through-edittext/




Ola!
eu segui este exemplo acho que tinha mais a ver com o meu projeto!

http://mysamplecode.com/2012/07/android-listview-cursoradapter-sqlite.html

Mas está me a dar estes erros:
Error:(86, 24) error: cannot find symbol method getFilter()
Error:(90, 16) error: cannot find symbol method setFilterQueryProvider()




Olá bom dia!
O projeto já corre sem erros, mas não está a filtrar os dados, não sei porque não funciona, alguma ajuda?




Ola Cristiana

coloque aqui a parte q é para filtrar os dados ..... p gente analisar....




ListarAluno.java


/////-/////-/////-/////
listView = (ListView) findViewById(android.R.id.list);
edtProcurar = (EditText) findViewById(R.id.edtProcurar);
/////-/////-/////-/////

/////-/////-/////-/////
datasource = new DBAdapter(this);
datasource.open();

Cursor cursor = datasource.getObservations();

String[] columns = new String[]{ "nome","idade" };

int[] to = new int[]{ R.id.nome, R.id.idade};

adapter = new SimpleCursorAdapter(
this,
R.layout.observation_list_item,
cursor,
columns,
to,
0);
this.setListAdapter(adapter);

listView.setAdapter(adapter);
datasource.close();

/////-/////-/////-/////

/////-/////-/////-/////

edtProcurar.addTextChangedListener(new TextWatcher() {

public void afterTextChanged(Editable s) {
}

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

public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s.toString());
}
});

adapter.setFilterQueryProvider(new FilterQueryProvider() {
@Override
public Cursor runQuery(CharSequence constraint) {
return datasource.getObservationsByNome(constraint.toString());
}
});

/////-/////-/////-/////




DBAdapter.java


public Cursor getObservations(){
Cursor cursor = database.rawQuery("select _id, foto, nome,idade from observation ORDER BY nome", null); //escola,observador
return cursor;
}

public Cursor getObservationsByNome(String inputText){
if(inputText == null || inputText.length () == 0) {
Cursor cursor = database.rawQuery("select _id, foto, nome,idade from observation ORDER BY nome", null);
return cursor;
}
else {
Cursor cursor = database.rawQuery("select _id, foto, nome,idade from observation ORDER BY nome, nome like '%" inputText.toString () "%'" , null);
return cursor;
}
}




Ola Cristiana

vc ja tentou nao fechar o datasource???




Olá bom dia!
Já tirei o datasource.close(); mas continua sem funcionar a filtragem!




Ola Cristiana

faz assim....

Cursor cursor = database.rawQuery("select _id, foto, nome,idade from observation where nome like '%" inputText.toString () "%'" , null);
return cursor;




Olá! já coloquei, mas mesmo assim continua sem funcionar!




ListarAluno.java


public class ListarAluno extends ListActivity {

//ListAdapter adapter; //permite mostrar várias informações em uma linha do ListView
DBAdapter datasource; //permite fazer operações na base de dados

SimpleCursorAdapter adapter;
ListView listView;
EditText edtProcurar;

Button btCancelar;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listaraluno);

/////-/////-/////-/////
listView = (ListView) findViewById(android.R.id.list);
edtProcurar = (EditText) findViewById(R.id.edtProcurar);
/////-/////-/////-/////

/////-/////-/////-/////
datasource = new DBAdapter(this);
datasource.open();

Cursor cursor = datasource.getObservations();

String[] columns = new String[]{ "nome","idade" };

int[] to = new int[]{ R.id.nome, R.id.idade};

adapter = new SimpleCursorAdapter(
this,
R.layout.observation_list_item,
cursor,
columns,
to,
0);
this.setListAdapter(adapter);

listView.setAdapter(adapter);
//datasource.close();

/////-/////-/////-/////

/////-/////-/////-/////

edtProcurar.addTextChangedListener(new TextWatcher() {

public void afterTextChanged(Editable s) {
}

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

public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s.toString());
}
});

adapter.setFilterQueryProvider(new FilterQueryProvider() {
@Override
public Cursor runQuery(CharSequence constraint) {
return datasource.getObservationsByNome(constraint.toString());
}
});

/////-/////-/////-/////

/////-/////-/////-/////
btCancelar = (Button) findViewById(R.id.btCancelar);

btCancelar.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
});
/////-/////-/////-/////
}

/////-/////-/////-/////
@Override
protected void onResume() {
super.onResume();

datasource.open();

Cursor cursor = datasource.getObservations();
String[] columns = new String[] { "nome","idade" };
int[] to = new int[] { R.id.nome, R.id.idade};
adapter = new SimpleCursorAdapter(
this,
R.layout.observation_list_item,
cursor,
columns,
to,
0);
this.setListAdapter(adapter);

listView.setAdapter(adapter);

//datasource.close();

/////-/////-/////-/////

edtProcurar.addTextChangedListener(new TextWatcher() {

public void afterTextChanged(Editable s) {
}

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

public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s.toString());
}
});

adapter.setFilterQueryProvider(new FilterQueryProvider() {
@Override
public Cursor runQuery(CharSequence constraint) {
return datasource.getObservationsByNome(constraint.toString());
}
});

/////-/////-/////-/////
}
/////-/////-/////-/////

/////-/////-/////-/////
// método que é chamado sempre que é clicado um item da lista
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Intent novo = new Intent(ListarAluno.this,EditarAluno.class);
Cursor cursor = (Cursor) adapter.getItem(position);
novo.putExtra("idObservation",cursor.getInt(cursor.getColumnIndex("_id")));
startActivity(novo);
}
/////-/////-/////-/////

}





DBAdapter.java


...

public Cursor getObservations(){
Cursor cursor = database.rawQuery("select _id, foto, nome,idade from observation ORDER BY nome", null); //escola,observador
return cursor;
}


public Cursor getObservationsByNome(String inputText) throws SQLException {
if(inputText == null || inputText.length () == 0) {
Cursor cursor = database.rawQuery("select _id, foto, nome,idade from observation ORDER BY nome", null);
return cursor;
}
else {
Cursor cursor = database.rawQuery("select _id, foto, nome,idade from observation ORDER BY nome where nome like '%" inputText.toString () "%'" , null);
return cursor;
}
}
}




mas da algum erro??




Bom dia!
não dá nenhum erro, mas na listagem ao digitar uma letra no edittext não faz a filtragem na listview.




Cristiana ,

veja esse topico

http://stackoverflow.com/questions/16336171/like-operator-syntax-in-sqlite-with-android

e para funcionar do jeito q vc qr eu axo melhor vc usar o autocompletetextview




Não está correto o método?


public Cursor getObservationsByNome(String inputText) throws SQLException {
if(inputText == null || inputText.length () == 0) {
Cursor cursor = database.rawQuery("select _id, foto, nome,idade from observation ORDER BY nome", null);
return cursor;
}
else {
Cursor cursor = database.rawQuery("select _id, foto, nome,idade from observation ORDER BY nome where nome like '%" inputText.toString () "%'" , null);
return cursor;
}
}


Eu estou a seguir um exemplo na qual não é usado o autocompletetextview.




Eu não sei se tas a perceber, eu quero digitar no edittext uma letra e na listview apareça os nomes todos começados por essa letra digitada no edittext.




Ola Cristiana

me da o exemplo q vc esta seguindo??




Olá!
já consegui fazer!
Fiz conforme o exemplo deste link :
http://mysamplecode.com/2012/07/android-listview-cursoradapter-sqlite.html

Coloquei modifiquei os métodos que tinha para listar os dados na listview da seguinte forma:


public Cursor getObservations(){
Cursor cursor = database.query(dbHelper.TABLE_OBSERVATION, new String[] {DbHelper.ID,
DbHelper.NOME, DbHelper.IDADE},
null, null, null, null, DbHelper.NOME);

if (cursor != null) {
cursor.moveToFirst();
}
return cursor;

}


e antes tinha assim :

public Cursor getObservations(){
Cursor cursor = database.rawQuery("select _id, foto, nome,idade from observation ORDER BY nome", null); //escola,observador
return cursor;
}


depois para a filtragem coloquei:


public Cursor getObservationsByNome(String inputText) throws SQLException {
Cursor cursor = null;
if (inputText == null || inputText.length () == 0) {
cursor = database.query(dbHelper.TABLE_OBSERVATION, new String[] {DbHelper.ID,
DbHelper.NOME, DbHelper.IDADE},
null, null, null, null, DbHelper.NOME);

} else {
cursor = database.query(dbHelper.TABLE_OBSERVATION, new String[] {DbHelper.ID,
DbHelper.NOME, DbHelper.IDADE},
DbHelper.NOME " like '%" inputText "%'",
null, null, null, null, null);

}
if (cursor != null) {
cursor.moveToFirst();
}
return cursor;

}


Obrigado na mesma pela atenção! =)