You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:49:11