3

In this code I have search multiple text ex. I have search sachin.

sachin is show the list but click to back sachin to sac not display to sa list on adapter. How to solve it without any library?


when I press back space and remove a char this time dos not list not display. Example

Suppose I have search sachin to text change sachin to sac. In this case not display sa list. I have clear all list that case display all list.
search sa show the list
sachin and sardar
now search sac
now display the sachin
search only sac to sc
that's time display only sachin
not disply the sardar in the list

My Adapter

private class ItemFilter extends Filter {
    protected FilterResults performFiltering(CharSequence constraint) {

        FilterResults results = new FilterResults();

        if (constraint != null && constraint.length() > 0) {
            ArrayList<Build> buildlist = new ArrayList<Build>();


            for (int i = 0; i < buildList.size(); i++) {
                if ((buildList.get(i).getName().toUpperCase())
                        .contains(constraint.toString().toUpperCase())) {

                    Build babydata = new Build(buildList.get(i).getImages(), buildList.get(i).getName());

                    buildlist.add(babydata);
                }
            }
            results.count = buildlist.size();
            results.values = buildlist;

        } else {
            results.count = buildList.size();
            results.values = buildList;
        }
        return results;

    }

    @Override
    protected void publishResults(CharSequence constraint,
                                  FilterResults results) {
        buildList = (ArrayList<Build>) results.values;
        notifyDataSetChanged();
    }
}

Activity class

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

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

            if (s.length() <= 0) {
                Log.d("jay", "s.length() <= 0" + s.toString());
                buildList.clear();
                buildList.addAll(buildListCopy);
                recyclerView.setAdapter(null);
                buildCustomAdapter = new BuildCustomAdapter(buildList);
                recyclerView.setAdapter(buildCustomAdapter);

            } else {
                buildCustomAdapter.getFilter().filter(s.toString());
            }
            Log.d("jay", "mobisharnam" + s.toString());
        }

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

        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });
Joy
  • 269
  • 1
  • 15

2 Answers2

2

Without any Library simple logic
Finally I have solution in this question

In your Adapter Constructor add the new copy list

After the copy list is add in filter

 private List<YourModel> modelList;
 private List<YourModel> modelListCopy;
 private ItemFilter mFilter = new ItemFilter();


 public YourAdapter(List<YourModel> modelList) {
    this.modelList= modelList;
    this.modelListCopy= new ArrayList<>();
    modelListCopy.addAll(modelList);
}
private class ItemFilter extends Filter {

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

        if (constraint != null && constraint.length() > 0) {
            List<YourModel> filterList = new ArrayList<YourModel>();

            for (int i = 0; i < modelListCopy.size(); i++) {
                if ((modelListCopy.get(i).getName().toUpperCase())
                        .contains(constraint.toString().toUpperCase())) {
                    YourModel builddata = new YourModel(modelListCopy.get(i).getImages(), modelListCopy.get(i).getName());
                    filterList.add(builddata);
                }
            }
            results.count = filterList.size();
            results.values = filterList;

        } else {
            results.count = modelListCopy.size();
            results.values = modelListCopy;
        }
        return results;
    }

    @Override
    protected void publishResults(CharSequence constraint,
                                  FilterResults results) {
        modelList= (ArrayList<YourModel>) results.values;
        notifyDataSetChanged();
    }


Activity Class

like this

 CustomAdapter youradapter= new CustomAdapter(modelList);
Joy
  • 269
  • 1
  • 15
0

I prefer Predicate for search filter I have changed your code to use Predicate, You have to use google guava library for that include following depedency in your gradle

compile 'com.google.guava:guava:19.0'

now, check following code

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

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

            String searchQuery = s.toString();
                if (buildListCopy != null && buildListCopy.size() > 0) {
                    buildList = Lists.newArrayList(Collections2.filter(buildListCopy, new SearchFilter(searchQuery)));
                    recyclerView.setAdapter(null);
                    if (buildList != null && buildList.size() > 0) {);
                        buildCustomAdapter = new BuildCustomAdapter(buildList);
                        recyclerView.setAdapter(buildCustomAdapter);
                        recyclerView.getAdapter().notifyDataSetChanged();
                    }
                }
                return false;
        }

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

        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });

Here is your search filter predicate which we have used above

/**
     * Custom Predicate class to filter list as per search query
     */
    public final class SearchFilter implements Predicate<Build> {
        private final Pattern pattern;

        public SearchFilter(final String regex) {
            pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.LITERAL);
        }

        @Override
        public boolean apply(final Build input) {
            return pattern.matcher(input.getName().toLowerCase()).find();
        }
    }
Divyang Panchal
  • 1,753
  • 1
  • 15
  • 25