有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用过滤器在RecycleView中比较OriginallList和filterList?

在这段代码中,我搜索了多个文本,例如,我搜索了sachin

sachin将显示列表,但单击可将sachin返回到适配器上的sac not display to sa列表。没有任何库如何解决它


当我这次按back space并删除一个字符时,dos not list not display。 范例

假设我将搜索sachin改为文本sachin改为sac。在这种情况下,不显示sa列表。我已清除所有列表,该案例显示所有列表。
搜索并显示列表
萨钦和萨达尔
现在搜索sac
现在显示sachin
仅搜索sac到sc
此时仅显示sachin
不显示列表中的sardar

我的适配器

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();
    }
}

活动课

 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) {
        }
    });

共 (2) 个答案

  1. # 1 楼答案

    我更喜欢搜索过滤器的谓词 我已经将您的代码更改为使用谓词,您必须使用GoogleGuava库 在你的简历中包括以下相关内容

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

    现在,检查下面的代码

    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) {
            }
        });
    

    这是我们在上面使用的搜索过滤器谓词

    /**
         * 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();
            }
        }
    
  2. # 2 楼答案

    没有任何库的简单逻辑
    我终于找到了这个问题的答案

    在适配器构造函数中添加新的副本列表

    复制列表在外接程序筛选器中显示后

     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();
        }
    


    活动类

    像这样

     CustomAdapter youradapter= new CustomAdapter(modelList);