>
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);
}
}
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 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;
}
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 {
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;
}