Amigos,
Vi no site http://escoladeandroid.blogspot.com.br/2011/12/trabalhando-com-listview-parte-4.html que é possível fazer busca de um determinado item na lista. O exemplo usa dados estáticos, ou seja, via código. Gostaria de saber como fazer isso usando dados do SQLite.
O exemplo abaixo mostra como podemos efetuar uma busca em um listview (search listview), esse recurso é bem interessante quando você já possui uma coleção de dados carregados em seu list e quer efetuar uma busca em cima desta lista.
Abaixo segue o fonte utilizado todo comentado para facilitar seu aprendizado:
package br.com.empresa;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class consulta extends Activity
{
private ListView lv;
private EditText et;
private String[] lstEstados;
private ArrayList<String> lstEstados_Encontrados = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.consulta);
lv = (ListView) findViewById(R.id.lvEstados);
et = (EditText) findViewById(R.id.etProcurar);
lstEstados = new String[] {"São Paulo", "Rio de Janeiro", "Minas Gerais", "Rio Grande do Sul",
"Santa Catarina", "Paraná", "Mato Grosso", "Amazonas"};
//Carrega o listview com todos os itens
lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, lstEstados));
CarregarEncontrados();
//Adiciona um TextWatcher ao TextView cujos métodos são chamados sempre
//que este TextView sofra alterações.
et.addTextChangedListener(new TextWatcher()
{
public void afterTextChanged(Editable s)
{
// Abstract Method of TextWatcher Interface.
}
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
// Abstract Method of TextWatcher Interface.
}
//Evento acionado quando o usuário teclar algo
//na caixa de texto "Procurar"
public void onTextChanged(CharSequence s, int start, int before, int count)
{
CarregarEncontrados();
//Carrega o listview com os itens encontrados
lv.setAdapter(new ArrayAdapter<String>(consulta.this, android.R.layout.simple_list_item_1, lstEstados_Encontrados));
}
});
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView arg0, View view, int position, long index) {
Mensagem("Você clicou no estado : " + lstEstados_Encontrados.get(position).toString());
}
});
}
public void CarregarEncontrados()
{
int textlength = et.getText().length();
//Limpa o array com os estados encontrados
//para poder efetuar nova busca
lstEstados_Encontrados.clear();
for (int i = 0; i < lstEstados.length; i++)
{
if (textlength <= lstEstados[i].length())
{
//Verifica se existe algum item no array original
//caso encontre é adicionado no array de encontrados
if(et.getText().toString().equalsIgnoreCase((String)lstEstados[i].subSequence(0, textlength)))
{
lstEstados_Encontrados.add(lstEstados[i]);
}
}
}
}
private void Mensagem(String msg)
{
Toast.makeText (getApplicationContext(), msg, Toast.LENGTH_SHORT).show ();
}
}
O código xml é esse:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<EditText
android:hint="Procurar"
android:id="@+id/etProcurar"
android:layout_height="wrap_content"
android:layout_width="fill_parent">
</EditText>
<ListView
android:id="@+id/lvEstados"
android:layout_height="wrap_content"
android:layout_width="fill_parent">
</ListView>
</LinearLayout>
Carrego a lista assim:
db.open();
Cursor clientes = db.getTodosClientes();
clientes.moveToFirst();
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.two_line_list_item, clientes, new String[] {DbAdapter.KEY_NOME, DbAdapter.KEY_CELULAR}, new int[] {android.R.id.text1, android.R.id.text2});
setListAdapter(adapter);
Como fazer isso?