2017-07-07 4 views
0

現在のところ、SearchViewを実装しようとしていますが、表示された検索結果は最初のSearchでのみ変更され、SearchViewに入力したものはすべて無視されます。RecyclerViewに表示されるオブジェクトのリストを検索するには?

は、ここに私のMainActivity.javaでの検索のための私のコードです:

testList = Arrays.asList(new TestItem("aw"), new TestItem("aa"), new TestItem("w")); 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.test_menu, menu); 

    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); 
    searchView.setOnQueryTextListener(this); 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onQueryTextChange(String newText) { 
    List<TestItem> result = new ArrayList<>(); 
    for(TestItem t: testList) { 
     if(t.getName().contains(newText) { 
      result.add(t); 
     } 
    } 
    adapter.changeList(result); 
    return true; 
} 

adapter.changeList:

public void changeList(List<TestItem> newList) { 
    this.list = new ArrayList<>(newList); 
} 

onQueryTextChangeは、各テキストの変更後に呼び出されますが、検索結果は一度だけ表示されます。 aEnterと入力すると、RecyclerViewはとaaと表示されます(onQueryTextChangeを開始するにはEnterキーを押す必要があります)。aaと入力すると、表示される項目は変わりません。

答えて

1

あなたの実装が正しくないと思います。検索結果の入力を押す必要はありません。実装のために、あなたの配列リストの無傷のコピーを保持することができます。その後、クエリテキストが変更されたときにリストする別の一時的なリストフォームを作成します。したがって、フィルタリングするときは、実際のリストをフィルタリングされたリストではなく検索しています。 「categoryMain」です:リストアダプタアダプタで

public boolean onQueryTextChange(String newText) { 

    adapter.getFilter().filter(newText); 
    return true; 
} 

2に

1.pass検索キーワードはフィルタを適用し、オーバーライドメソッドのフィルタリングクラスは、このようなものにすることができます

@Override 
public Filter getFilter() { 
    if (frameFilter == null) { 
     frameFilter = new FrameFilter(); 
    } 

    return frameFilter; 
} 

3を実装します私の無傷リストと「categoryTemp」は私の一時的なリストです

private class FrameFilter extends Filter { 

    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 

     FilterResults filterResults = new FilterResults(); 
     if (constraint != null && constraint.length() > 0) { 
      ArrayList<Category> tempList = new ArrayList<>(); 

      // search content in friend list 
      Log.i("key",constraint.toString()); 
      for (Category category : categoriesMain) { 
       if (category.getCategory_name().toLowerCase().contains(constraint.toString().toLowerCase())) { 
        tempList.add(category); 
       } 
      } 
      filterResults.count = tempList.size(); 
      filterResults.values = tempList; 
     } else { 

      filterResults.count = categoriesMain.size(); 
      filterResults.values = categoriesMain.clone(); 
     } 
     return filterResults; 
    } 

    /** 
    * Notify about filtered list to ui 
    * 
    * @param constraint text 
    * @param results filtered result 
    */ 
    @SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 

     categoriesTemp = (ArrayList<Category>) results.values; 
     notifyDataSetChanged(); 
    } 
} 
+0

ありがとうございました。 'filterResults.values = categoriesMain.clone();'を 'filterResults.values = categoriesMain'に置き換えれば、あなたのソリューションは私のために働きます。 – sininen

関連する問題