2016-09-24 45 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

相關問題