因此尝试使用searchview过滤RecyclerView,这是可行的,但是我发现的小错误是结果只是填充RecyclerView中第一项的信息,但是当单击或刷新屏幕时会显示正确的信息,在被搜索时,我猜想这与androidx有关,因为我关注的教程早于androidx。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);
MenuItem searchItem = menu.findItem(R.id.search);
adapter = new adapter(mainDishes.this, recipes);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return false;
}
});
return true;
}
@Override
public Filter getFilter() {
return exampleFilter;
}
private Filter exampleFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<Recipes> Filtered = new ArrayList<>();
if (constraint == null || constraint.length()== 0){
Filtered.addAll(mRecipesFiltered);
}else{
String FilterPattern = constraint.toString().toLowerCase().trim();
for (Recipes item : mRecipesFiltered){
if(item.getmrecipeName().toLowerCase().contains(FilterPattern)){
Filtered.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values = Filtered;
return results;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults results) {
mRecipes.clear();
mRecipes.addAll((List)results.values);
notifyDataSetChanged();
}
};
}
我一直在遵循encodinginflow.com教程,它可以正常工作,但是错误地指出并不确定从哪里开始。
search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
String userInput = newText.toLowerCase();
List<Recipes> newList = new ArrayList<>();
for (Recipes recipesList : item) {
if(recipesList.getmrecipeName.toLowerCase().contains(userInput){
newList.add(recipesList);
}
}
accountAdapter.upToDate(newList);
return true;
}
});