RecyclerView搜索功能过滤异常:输入内容后列表项消失求助
解决RecyclerView搜索时列表项消失的问题
看起来你遇到的问题主要集中在搜索逻辑的响应和原始数据的保存上,我帮你一步步排查和修复:
1. 让SearchView实时响应输入变化
你的onQueryTextChange方法直接返回了false,而且没有触发过滤操作——这意味着用户在搜索框输入内容时,完全不会触发过滤,只有点击提交按钮时才会执行一次过滤。另外,当用户清空搜索框时,也需要触发过滤来恢复全部数据。
修改HomeFragment中的SearchView.OnQueryTextListener:
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String s) { eventRecyclerAdapter.getFilter().filter(s); return true; // 返回true表示已处理该事件 } @Override public boolean onQueryTextChange(String s) { // 实时响应输入变化,调用过滤方法 eventRecyclerAdapter.getFilter().filter(s); return true; } });
2. 确保event_list_full正确保存原始数据
你提到event_list_full是event_list的副本,但如果只是直接赋值(比如event_list_full = event_list),两者会指向同一个List对象,后续event_list被清空时,event_list_full也会变成空。
在Adapter的构造函数中,要创建一个全新的List来存储原始完整数据:
public EventRecyclerAdapter(List<EventPost> originalEventList) { this.event_list = new ArrayList<>(originalEventList); // 用于展示的动态列表 this.event_list_full = new ArrayList<>(originalEventList); // 保存原始数据,过滤时作为数据源 }
注意:一定要在Firebase数据全部加载完成后再初始化Adapter,如果数据还没加载就创建Adapter,event_list_full会是空的,过滤时自然没有数据展示。
3. 优化Filter的类型转换与空值判断
在publishResults方法中做明确的类型转换,同时给getDesc()加空值判断,避免空指针异常:
@Override protected FilterResults performFiltering(CharSequence charSequence) { List<EventPost> filteredList = new ArrayList<>(); if( charSequence == null || charSequence.length()==0){ filteredList.addAll(event_list_full); } else { String filterPattern = charSequence.toString().toLowerCase().trim(); for(EventPost item : event_list_full){ // 避免getDesc()返回null导致崩溃 if(item.getDesc() != null && item.getDesc().toLowerCase().contains(filterPattern)){ filteredList.add(item); } } } FilterResults filterResults = new FilterResults(); filterResults.values = filteredList; return filterResults; } @Override protected void publishResults(CharSequence charSequence, FilterResults filterResults) { event_list.clear(); // 明确强转为List<EventPost>,避免类型转换警告 event_list.addAll((List<EventPost>) filterResults.values); notifyDataSetChanged(); }
按照这些步骤修改后,应该就能正常实现搜索过滤,不会出现列表项消失的问题了。
内容的提问来源于stack exchange,提问作者Martynas
相关产品推荐
相关产品推荐

