2017-07-07 74 views
0

我目前正试图实现一个SearchView,但显示的搜索结果只会改变第一个搜索,我忽略了进入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显示awaa(是否必须按Enter键以启动onQueryTextChange?),但是当我输入aa时,显示的项目保持不变。

回答

1

我认为你的实现是不正确的。您无需按搜索结果的输入。对于实现,您可以保留数组列表的完整副本。然后在查询文本发生更改时制作另一个临时列表表单。所以当你正在过滤时,你正在搜索实际列表而不是过滤列表。

1.pass搜索关键字的列表适配器

public boolean onQueryTextChange(String newText) { 

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

2.在适配器实现过滤性和覆盖方法

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

    return frameFilter; 
} 

3.过滤类可以是这样的: 'categoryMain' 是我的完整列表和'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'替换'filterResults.values = categoriesMain.clone();',你的解决方案对我有用。 – sininen