简体   繁体   中英

SimpleAdapter custom filter

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.

I had the same problem.

This code works for me.

protected void publishResults(CharSequence constraint, FilterResults results) {
        arrayList.clear();
        arrayList.addAll((Collection<? extends HashMap<String, String>>) results.values);
        if (results.count > 0) {
            notifyDataSetChanged();
        } else {
            notifyDataSetInvalidated();
        }       
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM