I'm trying to get a custom filter on a SimpleAdapter working and seem to be falling at the last hurdle. When debugging the code I can see the resulting filtered ArrayList in itemsFiltered in the publishResults method, but the complete list is always shown.
How do I get the adapter to work of the filtered results list not the complete unfiltered list?
Code is :
private class TextCharFilter extends Filter{
@Override
protected FilterResults performFiltering(CharSequence constraint) {
// convert search string to lower case - the filtering is not case sensitive
constraint = constraint.toString().toLowerCase();
// define the result object
FilterResults result = new FilterResults();
// define a place to hole the items that pass filtering
List<HashMap<String, String>> filteredItems = new ArrayList<HashMap<String,String>>();
// loop through the original list and any items that pass filtering are added to the "filtered" list
if(constraint != null && constraint.toString().length() > 0) {
for(int i = 0; i < items.size(); i++) {
HashMap<String, String> tmp = items.get(i);
String candidate = tmp.get("PT").toLowerCase();
if(candidate.contains(constraint) ) {
filteredItems.add(tmp);
}
}
// set the result to the "filtered" list.
result.count = filteredItems.size();
result.values = filteredItems;
}
else
{
// if nothing to filter on - then the result is the complete input set
synchronized(this)
{
result.values = items;
result.count = items.size();
}
}
return result;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
ArrayList<HashMap<String, String>> tmp = (ArrayList<HashMap<String, String>>)results.values;
itemsFiltered = new ArrayList<HashMap<String,String>>();
for (int i = 0; i < tmp.size(); i++){
itemsFiltered.add(tmp.get(i));
}
notifyDataSetChanged();
notifyDataSetInvalidated();
}
}
it looks like you are adding items to an arraylist that is created in publishResults(). the items are never added to the actual adapter. you should clear the adapter in publishResults() and then add the items back in. or just create a new adapter from the filter list and set that as your listview's adapter.