搜索框即时搜索的实现

    xiaoxiao2021-04-18  64

    博主最近做的项目需要实现一个搜索的功能

    而且还需要即时搜索-----输入关键字就有结果(包含关键字)自动显示

    这里说一下思路:

    监听EditText里面输入的内容

    使用系统提供的Filter对ListView进行过滤即可

    下面贴出关键代码

    //开启过滤 lv_search.setTextFilterEnabled(true); lv_search.setAdapter(new MyAdapter(this, strings)); //监听输入框的动作 et_search.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (TextUtils.isEmpty(s.toString().trim())) lv_search.clearTextFilter();//搜索文本为空时,清除ListView的过滤 else lv_search.setFilterText(s.toString().trim());//设置过滤关键字 } @Override public void afterTextChanged(Editable s) { } });

    这里是适配器的代码(注意一下,适配器要实现一个过滤器的接口------Filterable

    class MyAdapter extends BaseAdapter implements Filterable { List<String> datas; List<String> backDatas;//备份原始数据 Context context; MyFilter mFilter; public MyAdapter(Context context, List list) { datas = list; backDatas = list; this.context = context; } @Override public int getCount() { return datas.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { View inflate = LayoutInflater.from(context).inflate(R.layout.item, null); TextView tv_seach = (TextView) inflate.findViewById(R.id.tv_seach); tv_seach.setText(datas.get(position)); return tv_seach; } //当ListView调用setTextFilter()方法的时候,便会调用该方法 @Override public Filter getFilter() { if (mFilter == null) { mFilter = new MyFilter(); } return mFilter; } class MyFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) {//设置过滤规则 FilterResults filterResults = new FilterResults(); List<String> list; if (TextUtils.isEmpty(constraint)) { list = backDatas;//输入框内无内容,显示所有数据 } else { //将符合条件的数据放到集合中 list = new ArrayList<>(); for (String data : backDatas) { if (data.contains(constraint)) { list.add(data); } } } filterResults.values = list; //将得到的集合保存到FilterResults的value变量中 filterResults.count = list.size();//将集合的大小保存到FilterResults的count变量中 return filterResults; } @Override protected void publishResults(CharSequence constraint, FilterResults results) {//通知适配器更新数据 datas = (List<String>) results.values; if (results.count >0){ //刷新数据 notifyDataSetChanged(); LogUtils.e("publishResults------>notifyDataSetChanged"); }else { notifyDataSetInvalidated();//通知数据失效 LogUtils.e("publishResults------>notifyDataSetInvalidated"); } } } }

    (注意一下,适配器要实现一个过滤器的接口------Filterable

    这里我直接用内部类继承Filter,重写里面的两个方法对过滤器进行配置

    转载请注明原文地址: https://ju.6miu.com/read-674958.html

    最新回复(0)