2016-09-24 59 views
3

在这段代码中,我搜索了多个文本前缀。我有搜索萨钦。如何使用Filter将recyclerview中的originalList与filterList进行比较?

sachin显示列表,但点击后退sachin到sac不显示在适配器上的列表。如何解决它没有任何图书馆?


当我按回空格并删除一个字符这次没有列出不显示。 例子

假设我有搜索sachin到文本更改sachin到囊。在这种情况下不显示一个列表。我已经清楚所有列表中的情况显示所有列表。
搜索SA显示列表
萨钦和萨达尔
现在搜索囊
现在显示萨钦
只搜索囊,以SC
这一次只能显示萨钦
不DISPLY的萨达尔列表

我的适配器

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

请尝试我下面给出的答案,它的谓词非常容易,比过滤器更快,你只需要复制和粘贴代码 –

回答

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); 
0

我喜欢断言对于我已经改变了你的代码中使用谓词搜索过滤器 ,你必须使用谷歌番石榴库为 包括在您gradle这个

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

以下depedency现在,检查下面的代码

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

你好Divyang任何其他逻辑与我使用谷歌番石榴库吗? – Joy

+0

为什么你已经初始化buildlist&buildlist在你的ItemFilter类中复制上面的for循环,尝试删除这两行后 –

+0

好吧我会试试这个 – Joy

相关问题