【发布时间】:2023-04-05 14:04:02
【问题描述】:
我正在尝试在我的 RecyclerView 中实现搜索过滤器,就像在 this post 中一样
我已经对其进行了调试,它确实按预期过滤了项目,但应用程序中的列表似乎没有改变。 IE:我过滤了一个名字,有7个结果,在屏幕上是原始列表。
我的 onCreateMenuOptions 活动是:
@Override
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 SearchView.OnQueryTextListener() {
@Override public boolean onQueryTextSubmit(String filterString) {
adapter.getFilter().filter(filterString);
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
return true;
}
我的适配器如下所示:
public class AnimeAdapter extends RecyclerView.Adapter<AnimeAdapter.AnimeViewHolder> implements INameableAdapter {
private List<Anime> items;
private List<Anime> filteredItems;
private AnimeFilter animeFilter;
final private Context context;
@Override
public Character getCharacterForElement(int element) {
Character c = items.get(element).getTitle().charAt(0);
if(Character.isDigit(c)){
c = '#';
}
return c;
}
public static class AnimeViewHolder extends RecyclerView.ViewHolder {
// Campos respectivos de un item
final public ImageView img;
final public TextView title;
public AnimeViewHolder(View v) {
super(v);
img = (ImageView) v.findViewById(R.id.image);
title = (TextView) v.findViewById(R.id.title);
}
}
public AnimeAdapter(List<Anime> items, Context context) {
this.items = items;
this.context = context;
this.filteredItems = new ArrayList<>();
}
@Override
public int getItemCount() {
return items.size();
}
@Override
public AnimeViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.anime_card, viewGroup, false);
return new AnimeViewHolder(v);
}
@Override
public void onBindViewHolder(AnimeViewHolder viewHolder, int i) {
if (BuildConfig.DEBUG) {
//This is made to check if the image cache is working as expected.
Picasso.with(context).setIndicatorsEnabled(true);
Picasso.with(context).setLoggingEnabled(true);
}
final int position = i;
final ImageView imageView = viewHolder.img;
Picasso.with(context)
.load(items.get(i).getImageUrl())
.into(imageView);
viewHolder.title.setText(items.get(i).getTitle());
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
Intent intent = new Intent(context, TabActivity.class);
Bundle b = new Bundle();
b.putString("title", items.get(position).title);
b.putString("playlist", items.get(position).playlist);
imageView.buildDrawingCache();
Bitmap image = imageView.getDrawingCache();
b.putParcelable("imageBitmap", image);
intent.putExtras(b);
v.getContext().startActivity(intent);
}
});
}
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().toLowerCase().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();
}
}
}
我在这里忘记了什么?
提前致谢!
【问题讨论】:
-
你能把你的适配器的所有代码都放上去吗?
-
@ramineftekhari 完成,已编辑
标签: android android-recyclerview