删除SearchView筛选框文本后,RecyclerView无法恢复原数据求助
解决SearchView清空文本后RecyclerView无法恢复原始数据的问题
嘿,这个问题我之前也踩过坑!核心原因其实很简单——你大概率没在适配器里保存一份完整的原始数据集,筛选时直接修改了当前展示的列表,导致清空搜索词后没有数据可以还原了。
问题根源
很多新手写筛选逻辑时,会直接对RecyclerView绑定的列表做过滤操作,这样每次筛选后原列表就被覆盖修改了。当删除搜索文本时,没有原始数据可以恢复,自然就显示不出初始状态的内容了。
具体解决方案
1. 给适配器添加原始数据存储变量
首先在你的适配器里新增一个成员变量,专门用来保存完整的原始数据:
public class YourAdapter extends RecyclerView.Adapter<YourAdapter.ViewHolder> { private List<YourModel> mDisplayList; // 用于RecyclerView展示的数据集 private List<YourModel> mOriginalList; // 保存完整的原始数据 // 构造函数初始化数据 public YourAdapter(List<YourModel> data) { this.mDisplayList = new ArrayList<>(data); this.mOriginalList = new ArrayList<>(data); // 深拷贝原始数据,避免引用传递 } // ... 其他适配器核心代码(ViewHolder、onCreateViewHolder、onBindViewHolder等) }
2. 修改getFilter方法,基于原始数据筛选
接下来调整performFiltering逻辑,每次筛选都从原始数据里匹配,而不是当前的展示数据:
@Override public Filter getFilter() { return new Filter() { @Override protected FilterResults performFiltering(CharSequence charSequence) { String searchText = charSequence.toString().toLowerCase().trim(); List<YourModel> filteredData = new ArrayList<>(); // 搜索词为空时,直接使用原始完整数据 if (searchText.isEmpty()) { filteredData.addAll(mOriginalList); } else { // 遍历原始数据执行筛选逻辑 for (YourModel item : mOriginalList) { // 这里替换成你的实际筛选规则,比如匹配标题、内容等 if (item.getTargetField().toLowerCase().contains(searchText)) { filteredData.add(item); } } } FilterResults results = new FilterResults(); results.values = filteredData; results.count = filteredData.size(); return results; } @Override protected void publishResults(CharSequence charSequence, FilterResults filterResults) { mDisplayList.clear(); mDisplayList.addAll((List<YourModel>) filterResults.values); notifyDataSetChanged(); // 通知RecyclerView更新视图 } }; }
额外注意事项
- 如果你的
YourModel是自定义对象,要注意构造函数里的拷贝是深拷贝(如果对象包含复杂引用类型,需要重写clone方法或手动复制属性,防止原始数据被意外修改) - 所有筛选操作必须基于
mOriginalList,绝对不能直接修改这个列表,保证原始数据的完整性
这样修改后,当你清空SearchView的文本时,筛选逻辑会自动把原始完整数据赋值给展示列表,RecyclerView就能完美恢复初始状态啦!
内容的提问来源于stack exchange,提问作者Arun balaji




