【发布时间】:2017-11-11 17:38:23
【问题描述】:
我正在尝试在我的 RecyclerView 中实现搜索过滤器,就像在 this post 中一样
我现在面临的主要问题是 setOnQueryTextListener,在我的活动中:“找不到符号类 OnQueryTextListenerAdapter”。这可能是我确实需要创建的东西,或者我没有在我的活动中实施某些东西。它只是 MainActivity 扩展了 AppCompatActivity。
我的 onCreateMenuOptions 活动是:
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
final MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextListener(new OnQueryTextListenerAdapter() { @Override public boolean onQueryTextSubmit(String filterString) { adapter.getFilter().filter(filterString); return true; } });
return true;
}
我的适配器如下所示:
public class AnimeAdapter extends RecyclerView.Adapter<AnimeAdapter.AnimeViewHolder> implements INameableAdapter {
private List<Anime> items;
private List<Anime> filteredItems;
private AnimeFilter animeFilter;
用这个:
public Filter getFilter() {
if(animeFilter == null)
animeFilter = new AnimeFilter(this, items);
return animeFilter;
}
private static class AnimeFilter extends Filter {
private final AnimeAdapter adapter;
private final List<Anime> originalList;
private final List<Anime> filteredList;
private AnimeFilter(AnimeAdapter adapter, List<Anime> originalList) {
super();
this.adapter = adapter;
this.originalList = new LinkedList<>(originalList);
this.filteredList = new ArrayList<>();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
filteredList.clear();
final FilterResults results = new FilterResults();
if (constraint.length() == 0) {
filteredList.addAll(originalList);
} else {
final String filterPattern = constraint.toString().toLowerCase().trim();
for (final Anime anime : originalList) {
if (anime.getTitle().contains(filterPattern)) {
filteredList.add(anime);
}
}
}
results.values = filteredList;
results.count = filteredList.size();
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
adapter.filteredItems.clear();
adapter.filteredItems.addAll((ArrayList<Anime>) results.values);
adapter.notifyDataSetChanged();
}
我在这里忘记了什么?
提前致谢!
【问题讨论】:
标签: android android-recyclerview