Android Expandable list search view

187 Views Asked by At

Sorting on the child values. when I type searching works fine but when I remove the typed letters the list is not updating.

My model class

public class Category {

    public class SubCategory
    {
        public String name;

        public SubCategory(String name)
        {
            this.name = name;

        }
    }

    public String name;

    public ArrayList<SubCategory> categories;

    public Category(String name, ArrayList<SubCategory> categories)
    {
        this.name = name;
        this.categories = categories;
    }

}

snippet of adapter

 private ArrayList<Category> data;
    private ArrayList<Category> originalData;


    public CategoryListAdapter(Context context, ArrayList<Category> data)
    {
        this.context = context;
        this.data = data;
        this.originalData = new ArrayList<>();
        this.originalData.addAll(data);        }


    public Filter getFilter() {
        MyFilter filter = new MyFilter();
        return filter;
    }


  @Override
  protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();

            String filterString = constraint.toString().toLowerCase();
            Log.i("Tag" , filterString);
            final ArrayList<Category> processData = originalData;

            if(filterString.isEmpty()){

                results.values = processData;
                results.count = processData.size();
                Log.i("Tag" , "original"+ originalData.get(0).categories.size());

            }else {
                int count = processData.size();
                ArrayList<Category> nlist = new ArrayList<>();

                for (int i = 0; i < count; i++) {
                    Category cat = processData.get(i);
                    final ArrayList<RequestCategory> req_catgories = processData.get(i).categories;
                    final ArrayList<RequestCategory> new_list = new ArrayList<>();

                    for (RequestCategory req_catgory : req_catgories) {
                        if (req_catgory.display_name.toLowerCase().contains(filterString)) {
                            new_list.add(req_catgory);
                            Log.i("Sub category", "added");
                        }
                    }
                    cat.categories = new_list;
                    nlist.add(cat);
                }

                results.values = nlist;
                results.count = nlist.size();
            }
            Log.i("VALUES", results.values.toString());
            return results;
        }

Where was the issue ? I think my original list is modified somewhere ? Any help please?

3

There are 3 best solutions below

0
Sanjay Chauhan On

Please add try this to make some changes ..!

private ArrayList<Category> data;
        private ArrayList<Category> searchData;
        private ArrayList<Category> originalData;


        public CategoryListAdapter(Context context, ArrayList<Category> data) {
            this.context = context;
            this.data = data;
            this.searchData = data;
            this.originalData = data;
        }


        public Filter getFilter() {
            MyFilter filter = new MyFilter();
            return filter;
        }


        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();

            String filterString = constraint.toString().toLowerCase();
            Log.i("Tag", filterString);
            final ArrayList<Category> processData = searchData;

            if (filterString.isEmpty()) {

                results.values = processData;
                results.count = processData.size();
                Log.i("Tag", "original" + originalData.get(0).categories.size());

            } else {
                int count = processData.size();
                ArrayList<Category> nlist = new ArrayList<>();

                for (int i = 0; i < count; i++) {
                    Category cat = processData.get(i);
                    final ArrayList<RequestCategory> req_catgories = processData.get(i).categories;
                    final ArrayList<RequestCategory> new_list = new ArrayList<>();

                    for (RequestCategory req_catgory : req_catgories) {
                        if (req_catgory.display_name.toLowerCase().contains(filterString)) {
                            new_list.add(req_catgory);
                            Log.i("Sub category", "added");
                        }
                    }
                    cat.categories = new_list;
                    nlist.add(cat);
                }

                results.values = nlist;
                results.count = nlist.size();
            }
            Log.i("VALUES", results.values.toString());
            return results;
        }

I hope it's helpful to you ..!

2
Usman Rana On

Make following change in your performFiltering method:

replace

final ArrayList<Category> processData = originalData;

with

final ArrayList<Category> processData = new ArrayList<>();
processData.addAll(originalData);

currently your processData is referencing to originalData array and when you modify processData array then your originalData is changed too.

0
Chetan Joshi On

Replace below code with your part of code in Filter.

if(filterString==null||filterString.equals("")||filterString.length()==0){
      new_list.addAll(req_catgories);
}else{
   for (RequestCategory req_catgory : req_catgories) {
     if (req_catgory.display_name.toLowerCase().contains(filterString)) {
      new_list.add(req_catgory);
      Log.i("Sub category", "added");
     }
}}