【问题标题】:Filter ListView ArrayList过滤 ListView ArrayList
【发布时间】:2018-05-30 18:35:21
【问题描述】:

我正在尝试在我的列表视图中创建过滤器一段时间,但我做了几次不成功的尝试。 如果我尝试按“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;
    }

【问题讨论】:

  • 您要过滤什么?如果是列表,那么list.stream().filter(predicate).collect(...)

标签: android listview arraylist filter


【解决方案1】:

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

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
        }
}

【讨论】:

  • 最后一个问题,当我清理 editText 时,Listview 没有记录。我该如何解决这个问题?
  • 您需要将所有记录作为全局变量存储在适配器中,并且在语句if (filtro == null || filtro.length() == 0) { 中您需要使用您存储的全局存储的 allRecordsArraySet 填充结果。这很简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 2012-12-11
  • 2021-10-22
  • 2013-11-21
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
相关资源
最近更新 更多