2016-09-24 4 views
3

このコードでは、複数のテキストを検索しています。私は検索sachinを持っています。originalListとrecyclerviewのfilterListをFilterを使って比較するには?

sachinはリストを表示しますが、クリックするとsachinが表示されず、アダプタのsaリストには表示されません。どのようなライブラリなしでそれを解決するには?


私はスペースを押して、今度はcharを削除すると、リストには表示されません。 例

テキストを検索すると、文字列が検索されています。この場合、saリストは表示されません。私はすべてのリストを表示して、そのすべてのリストを表示します。
検索は現在、今嚢
を検索し、リスト
サチンとサルダール
を示しsaの
検索に時間表示ですが、唯一の
をサチンリストに

をサルダールをDISPLYないSC
にのみ嚢をサチンを表示マイアダプタ

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クラス

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

私は述語を使用するようにコードを変更した検索フィルタ のための述語を好む、あなたはその のGoogleグアバライブラリを使用する必要があなたのGradleで、次のdepedency

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

こんにちはDivyang他のロジックwithourグーグルグアバのライブラリを使用しますか? – Joy

+0

なぜビルドリストとビルドリストを初期化したのですか?forループのすぐ上のItemFilterクラスをコピーしてください。この両方の行を削除してから試してください –

+0

これを試してみます – Joy

関連する問題