Android带过滤SearchView无结果时显示Toast实现求助
实现SearchView无结果时的Toast提示方案
我来帮你搞定这个需求!你的过滤功能已经正常运行,现在只需要在过滤后无结果的时候添加Toast提示即可。核心思路是在过滤完成的回调方法里判断结果数量,下面是具体的修改步骤和代码:
步骤1:给CustomFilter添加Context引用
因为Toast需要Context才能创建,我们需要在CustomFilter的构造方法中传入Context:
修改CustomFilter.java:
import android.content.Context; import android.widget.Toast; import android.widget.Filter; import android.widget.FilterResults; import java.util.ArrayList; public class CustomFilter extends Filter { private ArrayList<Player> filterList; private MyAdapter adapter; private Context context; // 新增Context变量 // 修改构造方法,传入Context public CustomFilter(ArrayList<Player> filterList, MyAdapter adapter, Context context) { this.adapter = adapter; this.filterList = filterList; this.context = context; } @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); if (constraint != null && constraint.length() > 0) { constraint = constraint.toString().toUpperCase(); ArrayList<Player> filteredPlayers = new ArrayList<>(); for (int i = 0; i < filterList.size(); i++) { if (filterList.get(i).getName().toUpperCase().contains(constraint)) { filteredPlayers.add(filterList.get(i)); } } results.count = filteredPlayers.size(); results.values = filteredPlayers; } else { results.count = filterList.size(); results.values = filterList; } return results; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { adapter.players = (ArrayList<Player>) results.values; adapter.notifyDataSetChanged(); // 新增:判断无结果时显示Toast // 只有当用户输入了搜索内容,且结果数量为0时才提示 if (constraint != null && constraint.length() > 0 && results.count == 0) { Toast.makeText(context, "未找到结果", Toast.LENGTH_SHORT).show(); } } }
步骤2:修改MyAdapter,传入Context给CustomFilter
确保你的Adapter持有Context引用,这样才能传给CustomFilter:
修改MyAdapter.java:
import android.content.Context; import android.widget.Filter; import java.util.ArrayList; public class MyAdapter extends /* 这里替换成你的Adapter父类,比如RecyclerView.Adapter */ { public ArrayList<Player> players; public ArrayList<Player> filterList; private CustomFilter filter; private Context context; // 新增Context变量 // 修改Adapter构造方法,传入Context public MyAdapter(ArrayList<Player> players, Context context) { this.players = players; this.filterList = players; this.context = context; } @Override public int getItemCount() { return players.size(); } @Override public Filter getFilter() { if (filter == null) { // 创建CustomFilter时传入Context filter = new CustomFilter(filterList, this, context); } return filter; } // 其他原有方法... }
步骤3:初始化Adapter时传入Context
在你的Activity/Fragment中初始化Adapter时,记得传入Context:
// 示例:在Activity中 MyAdapter adapter = new MyAdapter(yourPlayerList, this); // 如果是Fragment,用 getContext() 代替 this
说明
- 我们在
publishResults方法中判断:只有当用户输入了有效搜索内容(constraint.length() > 0)且过滤结果为空(results.count == 0)时,才弹出Toast,避免用户清空搜索框时误触发提示。 - 通过Adapter持有Context,再传递给CustomFilter,保证Toast能正常显示。
这样修改后,当用户搜索无匹配结果时,就会弹出“未找到结果”的提示啦!
内容的提问来源于stack exchange,提问作者M.bala7
相关产品推荐
相关产品推荐

