筛选器列表视图数组列表



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

切勿每次都创建适配器类的新实例,而不是使用它:

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

在您的适配器类中,使用如下所示的内容:

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

最新更新