I update the code I have now:
public class ArrayAdapterWithCountingFilter extends AppCompatActivity implements Filter.FilterListener {
ListView lvElements;
TextView tvTotals;
EditText etSearch;
StringFilterCountArrayAdapter adapter;
Filter.FilterListener listener;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_arrayadapter);
String tokens[] =
{"Constitución Española",
"Ley Orgánica 10/1995, de 23 de noviembre, del Código Penal",
"Real Decreto de 14 de septiembre de 1882 por el que se aprueba la Ley de Enjuiciamiento Criminal",
"Ley Orgánica 4/2015, de 30 de marzo, de protección de la seguridad ciudadana",
"Ley Orgánica 4/2000, de 11 de enero, sobre derechos y libertades de los extranjeros en España y su integración social",
};
lvElements = (ListView) findViewById(R.id.lvElements);
tvTotals = (TextView) findViewById(R.id.tvTotals);
etSearch = (EditText) findViewById(R.id.etSearch);
etSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
ArrayAdapterWithCountingFilter.this.adapter.getFilter().filter(arg0);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { }
@Override
public void afterTextChanged(Editable arg0) { }
});
List data = new ArrayList();
data.addAll(Arrays.asList(tokens));
adapter = new StringFilterCountArrayAdapter(this,R.layout.list_text_item, R.id.tvLisTextItem,data );
lvElements.setAdapter(adapter);
onFilterComplete(data.size()); //El parámetro no se usa pero ya que estamos pasémoslo bien
}
@Override
public void onFilterComplete(int count) {
String totalsText = String.format("%d/%d", adapter.getFilteredCount(), adapter.getTotalCount());
tvTotals.setText(totalsText);
}
public static class StringFilterCountArrayAdapter extends ArrayAdapter<String>{
private int filteredCount = getCount ();
private List<String> objects;
private List<String> origObjects = new ArrayList<>();
private Filter.FilterListener callbackListener;
public StringFilterCountArrayAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull List<String> objects) {
super(context, resource, textViewResourceId, objects);
this.objects = objects;
origObjects.addAll(objects);
this.callbackListener = (Filter.FilterListener) context;
}
public int getFilteredCount() {
return filteredCount;
}
public int getTotalCount(){
return origObjects.size();
}
@NonNull
@Override
public Filter getFilter() {
Filter filter = new Filter(){
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
if(constraint == null || constraint.toString().trim().length() == 0){
filterResults.values = origObjects;
}else{
List<String> filtered = new ArrayList<>();
for(String s : origObjects){
if(s.contains(constraint)){
filtered.add(s);
}
}
filterResults.values = filtered;
filterResults.count = filtered.size();
}
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
objects.clear();
objects.addAll((List<String>) results.values);
filteredCount = results.count;
notifyDataSetChanged();
callbackListener.onFilterComplete(filteredCount);
}
};
return filter;
}
}
}