首页 > 解决方案 > 过滤 ListView ArrayList

问题描述

我尝试了一段时间在我的列表视图中创建一个过滤器,我做了几次不成功的尝试。如果我试图按“bairro”字段进行过滤,目前它不会返回任何错误,因此我可以寻找可能的解决方案,而不是对称的。

在我的列表的开头,我已经有一个固定的过滤器,它只显示状态为“PROGRAMADA”的记录和其他按日期过滤的记录。

我的最后一次尝试:

public void getOSProgramada(){
        final ArrayList<OrdemServico> lstOsProgramada = new ArrayList<>();

        if(ordem_servicoSerializado.exists()){
            try {
                ArrayList<OrdemServico> lstOS = (ArrayList<OrdemServico>) new SerializarDados().restauraDadosemArquivo(config.sARMAZENAMENTO_ARQUIVO_LOCAL, "ordem_servico");
                Usuario usu = (Usuario) new SerializarDados().restauraDadosemArquivo(config.sARMAZENAMENTO_ARQUIVO_LOCAL, "usuario");

                for(int i = 0; i < lstOS.size(); i++){
                    if(lstOS.get(i).getNid_usuario() == usu.getNid_usuario() && lstOS.get(i).getSstatus().equals("PROGRAMADA")
                            && lstOS.get(i).getSdata_programada().equals(""+config.getDataAtual())){

                        OrdemServico os = new OrdemServico();

                        os.setNnumero_os(lstOS.get(i).getNnumero_os());
                        os.setStipo(lstOS.get(i).getStipo());
                        os.setSnome(lstOS.get(i).getSnome());
                        os.setSendereco(lstOS.get(i).getSendereco());
                        os.setSstatus(lstOS.get(i).getSstatus());
                        os.setSdata_programada(lstOS.get(i).getSdata_programada());
                        os.setSdata_conclusao(lstOS.get(i).getSdata_conclusao());
                        os.setNuc(lstOS.get(i).getNuc());
                        os.setSmedidor(lstOS.get(i).getSmedidor());
                        os.setSbairro(lstOS.get(i).getSbairro());
                        os.setScidade(lstOS.get(i).getScidade());
                        os.setScomplemento(lstOS.get(i).getScomplemento());
                        os.setNsetor(lstOS.get(i).getNsetor());
                        os.setSlatitude(lstOS.get(i).getSlatitude());
                        os.setSlongitude(lstOS.get(i).getSlongitude());
                        os.setsNovaObs(lstOS.get(i).getsNovaObs());


                        lstOsProgramada.add(os);
                    }
                }

                setListAdapter(new OrdemServicoAdapter(MenuPrincipalActivity.this, lstOsProgramada));

                EditText editText = (EditText) findViewById(R.id.editText1);
                editText.addTextChangedListener(new TextWatcher() {


                    public void onTextChanged(CharSequence s, int start, int before,
                                              int count) {
                        //quando o texto é alterado chamamos o filtro.
                        new OrdemServicoAdapter(MenuPrincipalActivity.this, lstOsProgramada).getFilter().filter(s.toString());

                    }

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

                    @Override
                    public void afterTextChanged(Editable s) {
                    }
                });


            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

适配器:

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.
                final ArrayList<OrdemServico> lstOsProgramada = new ArrayList<>();

                if (filtro == null || filtro.length() == 0) {
                    results.count = lstOsProgramada.size();
                    results.values = lstOsProgramada;
                } else {
                    try {
                        ArrayList<OrdemServico> lstOS = (ArrayList<OrdemServico>) new SerializarDados().restauraDadosemArquivo(config.sARMAZENAMENTO_ARQUIVO_LOCAL, "ordem_servico");

                        //percorre toda lista verificando se contem a palavra do filtro na descricao do objeto.
                        for (int i = 0; i < lstOS.size(); i++) {
                            OrdemServico os = new OrdemServico();

                            filtro = filtro.toString().toUpperCase();
                            String condicao = lstOS.get(i).getSbairro().toUpperCase();

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

                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                    }


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

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint, Filter.FilterResults results) {
                lista = (ArrayList<OrdemServico>) results.values; // Valores filtrados.
                notifyDataSetChanged();  // Notifica a lista de alteração
            }

        };
        return filter;
    }

标签: androidlistviewarraylistfilter

解决方案


你不应该每次都创建适配器类的新实例,而不是使用这个:

adapter = new OrdemServicoAdapter(MenuPrincipalActivity.this, lstOsProgramada);
setListAdapter(adapter);

EditText editText = (EditText) findViewById(R.id.editText1);
editText.addTextChangedListener(new TextWatcher() {
    public void onTextChanged(CharSequence s, int start, int before,
                              int count) {
        //quando o texto é alterado chamamos o filtro.
        adapter.getFilter().filter(s.toString());
        postInvalidate();
    }

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

    @Override
    public void afterTextChanged(Editable s) {
    }
});

在您的 Adapter 类中使用如下内容:

private CustomFilter filter;

@Override
public Filter getFilter() {
    if (filter == null) {
        filter = new CustomFilter();
    }
    return filter;
}

private class CustomFilter extends Filter {

    @Override
        protected FilterResults performFiltering(CharSequence filtro) {
            String searchPhrase = constraint.toString();

            FilterResults results = new FilterResults();
            //se não foi realizado nenhum filtro insere todos os itens.
            final ArrayList<OrdemServico> lstOsProgramada = new ArrayList<>();

            if (filtro == null || filtro.length() == 0) {
                results.count = lstOsProgramada.size();
                results.values = lstOsProgramada;
            } else {
                try {
                    ArrayList<OrdemServico> lstOS = (ArrayList<OrdemServico>) new SerializarDados().restauraDadosemArquivo(config.sARMAZENAMENTO_ARQUIVO_LOCAL, "ordem_servico");

                    //percorre toda lista verificando se contem a palavra do filtro na descricao do objeto.
                    for (int i = 0; i < lstOS.size(); i++) {
                        OrdemServico os = new OrdemServico();

                        filtro = filtro.toString().toUpperCase();
                        String condicao = lstOS.get(i).getSbairro().toUpperCase();

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

                } catch (IOException e) {
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }


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

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, Filter.FilterResults results) {
            lista = (ArrayList<OrdemServico>) results.values; // Valores filtrados.
            notifyDataSetChanged();  // Notifica a lista de alteração
        }
}

推荐阅读