我目前正在尝试实施SearchView,但显示的搜索结果仅针对第一个搜索进行更改,我在SearchView中输入的所有内容都将被忽略。
以下是我的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,但搜索结果只显示一次。在输入a
和Enter
时,RecyclerView会显示aw
和aa
(正常情况下必须按Enter键才能启动onQueryTextChange
),但是当我然后输入aa
显示的项目保持不变。
答案 0 :(得分:1)
我认为您的实施不正确。您无需按Enter键即可搜索结果。为了实现,您可以保留数组列表的完整副本。然后在更改查询文本时创建另一个临时列表表单。因此,当您进行过滤时,您正在搜索实际列表而不是过滤列表。
1.将搜索关键字传递给列表适配器
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return true;
}
2。在适配器实现Filterable和覆盖方法
@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();
}
}