Philipus Silaen
Philipus Silaen

Reputation: 251

Listview filter adapter.getFilter().filter(by more than one value)

I have created a list view in android and I already implement search filter by using searchview and charsequence as parameter like this

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String query) {
                adapter.getFilter().filter(query);
                return false;
            }
        });

now how can I get the filter result by more than one value? adapter.getFilter().filter("example" || "example" || example); is it possible to do that? or maybe can I using adapter.getFilter().filter(array here)?

EDIT: this is my filter

public class CustomFilter extends Filter {

    List<Event> filterList;
    EventAdapter adapter;

    public CustomFilter(List<Event> filterList, EventAdapter adapter) {
        this.filterList = filterList;
        this.adapter = adapter;
    }

    //FILTERING
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {

        //RESULTS
        FilterResults results=new FilterResults();

        //VALIDATION
        if(constraint != null && constraint.length()>0)
        {

            //CHANGE TO UPPER FOR CONSISTENCY
            constraint=constraint.toString().toUpperCase();

            ArrayList<Event> filteredEvent=new ArrayList<>();

            //LOOP THRU FILTER LIST
            for(int i=0;i<filterList.size();i++)
            {
                //FILTER (tinggal mainin logic aja mau filter berdasarkan apa nya )
                if(filterList.get(i).getJudul().toUpperCase().contains(constraint)|| filterList.get(i).getDeskripsi().toUpperCase().contains(constraint))
                {
                    filteredEvent.add(filterList.get(i));
                }
            }

            results.count=filteredEvent.size();
            results.values=filteredEvent;
        }else
        {
            results.count=filterList.size();
            results.values=filterList;
        }

        return results;
    }


    //PUBLISH RESULTS

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {

        adapter.eventes= (List<Event>) results.values;
        adapter.notifyDataSetChanged();

    }
}

Upvotes: 2

Views: 2955

Answers (2)

Shahar Medina
Shahar Medina

Reputation: 31

You can check my reference for your question.

i implement this with one String that include the values for two different filters , and add a split mark (in this case : "-") between the two values in the String.

MainActivity.class

            String lat = latitude.getText().toString();
            String lon = longitude.getText().toString();
            //join the two strings and add a split mark '-'
            String join = lat + "-" + lon;  

            mca.getFilter().filter(join); //mca is my cursorAdapter
            mca.notifyDataSetChanged();

            mca.setFilterQueryProvider(new FilterQueryProvider() {
                @Override
                public Cursor runQuery(CharSequence constraint) {
                    String value = constraint.toString();
                    return getFilterResults(value);
                }

            });

getFilterResult(String filterValue)

 public Cursor getFilterResults(String filterValue) {

    Cursor c = getLoactionTimeEntry(); //some default init
    String lat = "";
    String lon = "";
    String[] splitFilterValue = filterValue.split("-");

    if(filterValue.charAt(0) == '-') {
        lon = splitFilterValue[1];
        c = getLongitudeFilter(lon);
    }
    else if(splitFilterValue.length == 2) {
        lat = splitFilterValue[0];
        lon = splitFilterValue[1];
        c = getLongtitudeLatitudeFilter(lat,lon);
    }
    else {
        lat = splitFilterValue[0];
        c = getLatitudeFilter(lat);
    }

    return c;
 }

in my filters method i split the String with the function split() and store the values back to separate string's variables. the functions: getLongitudeFilter(lon) , getLongtitudeLatitudeFilter(lat,lon), getLatitudeFilter(lat) is my functions that return some Cursor to get what i need from the DataBase in this case.

Upvotes: 3

Karakuri
Karakuri

Reputation: 38595

You cannot change API of the framework class. There is no method on the Filter class that takes multiple constraint arguments. If you want to keep using Filter, you can only combine your arguments in a way that you can separate them again inside of the filter() method, e.g. by joining them into a comma-separated string and then splitting the string.

Alternatively, you don't need to use the Filter class, you can make your own class that can take (for instance) a List<String> and does the filtering you want, and then set the filtered results in your adapter. The only difficult part is now you must handle the logic for doing that work in the background, canceling the work if another filter call happens while it's in progress, etc.

Upvotes: 0

Related Questions