Miroslav Bursa
Miroslav Bursa

Reputation: 13

Android: ArrayList - filtering

I try added filter to ArrayList (data is from json/php script on my server). I find but I not see resolving...

I try more sample codes and more resolving, but nothing works.

        listView = (ListView) findViewById(R.id.list);

        list = new ArrayList<FriendItem>();
        adapter = new FriendAllAdapter(context, list);


        listView.setAdapter(adapter);


        String filename = getResources().getString(R.string.friendalllist_php);
        asyncLoadVolley = new AsyncLoadVolley(context, filename);
        Map<String, String> map = new HashMap<String, String>();
        map.put(Constant.ID, Sessions.getUserId(context));
        asyncLoadVolley.setBasicNameValuePair(map);
        asyncLoadVolley.setOnAsyncTaskListener(asyncTaskListener);

        connectionDetector = new ConnectionDetector(context);

        if(savedInstanceState==null) {

        }
        //enables filtering for the contents of the given ListView
        listView.setTextFilterEnabled(true);

        listView.setOnItemClickListener(listItemClickListener);

        EditText myFilter = (EditText) findViewById(R.id.myFilter);
        myFilter.addTextChangedListener(new TextWatcher() {

        public void afterTextChanged(Editable s) {
        }

        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        public void onTextChanged(CharSequence s, int start, int before, int count) {

        //here added filter... 

        }
        });             

Upvotes: 0

Views: 6737

Answers (1)

DuoBlood
DuoBlood

Reputation: 71

For example: You have a model - FriendItem

public class FriendItem {

    private String firstName;
    private String lastName;

    //.....

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }
}

and have an adapter - FriendAllAdapter. In this adapter you should implement Filterable interface. You"ll need to Override getFilter() method and return new object of Filter class (android.widget.Filter).

  • In performFiltering() method your need return FilterResults object with count of filtered elements and value - list of elements. Also in this method you need to realize the algorithm comparison of the search query to values in your FriendItem (list item). In my example I search FriendItem(s) which fields (firstName or lastName) contains text in my editText. Input parameter is a CharSequence object which you set in onTextChanged() method on added textChangeListener to your EditText.

    myFilter.addTextChangedListener(new TextWatcher() {
    
        public void onTextChanged(CharSequence s, int start, int before, int count) {
    
            adapter.getFilter().filter(s); 
    
        }
    });
    
  • In publishResults() method your get filtering result your need cast results.values to List and replace your list to filtering result.

    public class FriendAllAdapter extends BaseAdapter implements Filterable {       
    
        private List<FriendItem> list;
        private final List<FriendItem> fullList = new ArrayList<>();
    
        public FriendAllAdapter(Context context, List<FriendItem> list) {
    
            //...... your code
    
            this.list = list;
            fullList.addAll(list);
        }
    
    
        //...... your code
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            //... your code
        }
    
        @Override
        public Filter getFilter() {
            Filter filter = new Filter() {
                @Override
                protected FilterResults performFiltering(CharSequence constraint) {
                    FilterResults results = new FilterResults();
    
                        if (constraint == null || constraint.length() == 0) { // if your editText field is empty, return full list of FriendItem
                            results.count = fullList.size();
                            results.values = fullList;
                        } else {
                            List<FriendItem> filteredList = new ArrayList<>();
    
                            constraint = constraint.toString().toLowerCase(); // if we ignore case
                            for (FriendItem item : fullList) {
                                String firstName = item.getFirstName().toLowerCase(); // if we ignore case
                                String lastName = item.getLastName().toLowerCase(); // if we ignore case
                                if (firstName.contains(constraint.toString()) || lastName.contains(constraint.toString())) {
                                    filteredList.add(item); // added item witch contains our text in EditText
                                }
                            }
    
                            results.count = filteredList.size(); // set count of filtered list
                            results.values = filteredList; // set filtered list
                        }
                    return results; // return our filtered list
                }
    
                @Override
                protected void publishResults(CharSequence constraint, FilterResults results) {
    
                        list = (List<FriendItem>) results.values; // replace list to filtered list 
                        notifyDataSetChanged(); // refresh adapter
                }
            };
            return filter;
        }
    }
    

I think you`ll understand it. P.S. sorry for my English.

Upvotes: 1

Related Questions