GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

[Resolvido] SearchView ou metodo filter nao esta funcionando corretamente


#1

Boa tarde!

Estou desenvolvendo uma aplicação utilizando um searchView. Está funcionando bem a parte de busca, porem se eu apago algum caracter ele nao me devolve a lista anterior.

tenho minha activity:

public class Activity_ListaRota extends ActionBarActivity {

private ListView listViewLinha;
AdapterRota adapterClientes;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity__lista_rota);

    listViewLinha = (ListView) findViewById(R.id.listViewLinha);




    adapterClientes = new AdapterRota(this, new Banco(this).listaLinha());




    listViewLinha.setAdapter(adapterClientes);


}

@Override

public boolean onCreateOptionsMenu(Menu menu) {


    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_search, menu);

    MenuItem item = menu.findItem(R.id.search);

    SearchView searchView = (SearchView) item.getActionView();

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {


        @Override
        public boolean onQueryTextSubmit(String s) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String s) {

            adapterClientes.getFilter().filter(s);

            return false;


        }

    });

    return super.onCreateOptionsMenu(menu);


}

}

e meu adapter com metodo getFilter:

public Filter getFilter() {
    Filter filter = new Filter() {

        @Override
        protected FilterResults performFiltering(CharSequence filtro) {
            FilterResults results = new FilterResults();
            //se não foi realizado nenhum filtro insere todos os itens.
            if (filtro == null || filtro.length() == 0) {
                results.count = listaTabelaRota.size();
                results.values = listaTabelaRota;

                return results;

            } else {
                //cria um array para armazenar os objetos filtrados.
                List<Rota> itens_filtrados = new ArrayList<Rota>();

                //percorre toda lista verificando se contem a palavra do filtro na descricao do objeto.
                for (int i = 0; i < listaTabelaRota.size(); i++) {
                    Rota data = listaTabelaRota.get(i);

                    filtro = filtro.toString().toLowerCase();
                    String condicao = data.getNome().toLowerCase();

                    if (condicao.contains(filtro)) {
                        //se conter adiciona na lista de itens filtrados.
                        itens_filtrados.add(data);
                    }


                }
                // Define o resultado do filtro na variavel FilterResults
                results.count = itens_filtrados.size();
                results.values = itens_filtrados;
            }
            return results;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, Filter.FilterResults results) {

            listaTabelaRota = (List<Rota>) results.values;

            notifyDataSetChanged();  // Notifica a lista de alteração


        }

    };


    return filter;

}

Segue a execução, apagando o caracter no campo da busca ele nao retorna a lista inicial:

Segue minha lista completa:

Como viram ele deveria retornar a listview com os dados iniciais do adapter, mas simplesmente fica em branco. Tambem se eu realizo uma nova busca ele nao faz nada.

Alguem me da uma luz. Grato desde já!!!


#2

Boa tarde pessoal! Consegui resolver e vou postar a resolução caso alguem venha a passar pelo mesmo problema.

O erro estava na implementação do metodo getFilter() do meu adapter. Segue a correção:

private LayoutInflater mInflater;
private Context ctx;
private List listaTabelaRota;
private List mOriginalList; <------------------------ muito importante essa lista auxiliar

public Filter getFilter() {
    Filter filter = new Filter() {

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {

            listaTabelaRota = (List <Rota> ) results.values;
            notifyDataSetChanged();
        }


        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            FilterResults results = new FilterResults();
            List <Rota> FilteredArrList = new ArrayList <Rota> ();

            if (mOriginalList == null) {
                mOriginalList = new ArrayList <Rota> (listaTabelaRota);
            }

            if (constraint == null || constraint.length() == 0) {
                //código se por acaso o filtro for vazio.

                ///caso queira voltar a lista original use esse código
                results.count = mOriginalList.size();
                results.values = mOriginalList;


                //caso queria deixá-la vazia:
               // results.count = 0;
              //  results.values = new ArrayList<Rota>();

            } else {
                constraint = constraint.toString().toLowerCase();
                for (int i = 0; i < mOriginalList.size(); i++) {
                    Rota v = mOriginalList.get(i);
                    String data = v.getNome();
                    if (data.toLowerCase().startsWith(constraint.toString())) {
                        FilteredArrList.add(v);
                    }
                }

                results.count = FilteredArrList.size();
                results.values = FilteredArrList;
            }
            return results;
        }
    };
    return filter;
}