iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android实现模拟搜索功能
  • 161
分享到

Android实现模拟搜索功能

2024-04-02 19:04:59 161人浏览 安东尼
摘要

本文实例为大家分享了Android实现模拟搜索功能的具体代码,供大家参考,具体内容如下 先看效果图,合适了再接着往下看: 我们看到的这个页面,是由两部分组成,顶部的自定义的搜索框,

本文实例为大家分享了Android实现模拟搜索功能的具体代码,供大家参考,具体内容如下

先看效果图,合适了再接着往下看:

我们看到的这个页面,是由两部分组成,顶部的自定义的搜索框,和listView组成。

首先我们来实现布局页面,自定义搜索框,和设置listView


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="Http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SearchBoxActivity"
    android:orientation="vertical"
    >
    <EditText
        android:id="@+id/et_search"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:hint="搜索名称"
        android:background="@drawable/btn_search"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="10dp"
        android:maxLines="1"
        android:maxLength="20"
        android:inputType="text"
        android:drawableLeft="@drawable/search"
        />
    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
</LinearLayout>

其中EditeText控件中的 android:background="@drawable/btn_search"

这个btn_search.xml 是在drawable目录下定义的。

btn_search.xml


<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <padding
        android:bottom="5dp"
        android:left="5dp"
        android:right="5dp"
        android:top="5dp" />
    <stroke
        android:width="2dp"
        android:color="@color/blue" />
    <solid android:color="@color/white" />
    <corners android:radius="20dp" />
</shape>

之后我们就来实现搜索搜索功能。

使用ListView控件就要给这个控件设置适配器,我们就先来创建一个适配器SearchAdapter,里面的list集合泛型是我自己创建的一个类,类里面只有一个String属性,实现了get和set方法,还有构造器。

在适配器中创建了一个内部类MyFilter,继承了Filter类,这个Filter类是Google官方提供的,实现数据过滤。之后我们重写其中的两个方法perfORMFiltering 和publishResults 自己制定过滤规则。


public class SearchAdapter extends BaseAdapter implements Filterable {
    private Context context;
    private ArrayList<Simulation> list = new ArrayList<>();
    private MyFilter filter; //创建MyFilter对象
    private FilterListener listener = null; //接口对象

    public SearchAdapter(Context context, ArrayList<Simulation> list, FilterListener listener) {
        this.context = context;
        this.list = list;
        this.listener = listener;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        try {
            final ViewHold hold;
            if (convertView == null) {
                hold = new ViewHold();
                convertView = LayoutInflater.from(context).inflate(R.layout.item_search, null);
                hold.tv_simulation = convertView.findViewById(R.id.tv_simulation);
                convertView.setTag(hold);
            } else {
                hold = (ViewHold) convertView.getTag();
            }
            Simulation simulation = list.get(position);
            hold.tv_simulation.setText(simulation.getText());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return convertView;
    }

    public Filter getFilter() {
        if (filter == null) {
            filter = new MyFilter(list);
        }
        return filter;
    }

    
    class MyFilter extends Filter {
        //创建集合保存原始数据
        private ArrayList<Simulation> original = new ArrayList<>();

        public MyFilter(ArrayList<Simulation> original) {
            this.original = original;
        }

        //该方法返回搜索过滤后的数据
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            //创建FilterResults对象
            FilterResults filterResults = new FilterResults();
            
            if (TextUtils.isEmpty(constraint)) {
                //取出当前的数据源的值和集合元素个数
                //此时返回的filterResults就是原始的数据,不进行过滤
                filterResults.values = original;
                filterResults.count = original.size();
            } else {
                ArrayList<Simulation> mList = new ArrayList<>();
                //创建集合保护过滤后的数据
                for (Simulation s : original) {
                    //这里的toLowerCase():是将字符串中的字母全部变为小写,而非字母则不做改变
                    if (s.getText().trim().toLowerCase().contains(constraint.toString().trim().toLowerCase())) {
                        //规则匹配的话就往集合中添加该数据
                        mList.add(s);
                    }
                }
                filterResults.values = mList;
                filterResults.count = mList.size();
            }
            return filterResults;
        }

        //该方法用来刷新用户界面,根据过滤后的数据重新展示列表
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            //获取过滤后的数据
            list = (ArrayList<Simulation>) results.values;
            //如果接口对象不为空,那么调用接口中的方法获取过滤后的数据,具体的实现在new这个接口的时候重写的方法里执行
            if (listener != null) {
                listener.getFilterData(list);
            }
            //刷新数据源显示
            //通知数据观察者当前所关联的数据源已经发生改变,任何与该数据有关的视图都应该去刷新自己。
            notifyDataSetChanged();
        }
    }

    public interface FilterListener{
        void getFilterData(List<Simulation> list);
    }

    public final class ViewHold {
        private TextView tv_simulation;
    }

}

之后我们在SearchBoxActivity中,对EditText控件的TextChanged进行实时监听,然后对输入的关键字与ListView中的数据源进行循环遍历、过滤,再把新数据源通过适配器刷新到ListView上。这么一个过程。


public class SearchBoxActivity extends AppCompatActivity {
    private static final String TAG = "SearchBoxActivity";
    private EditText et_search;
    private ListView listView;
    private SearchAdapter searchAdapter;

    private ArrayList<Simulation> list = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search_box);
        et_search = findViewById(R.id.et_search);
        listView = findViewById(R.id.listView);
        String data[] = new String[]{"大数据", "Android开发", "Java开发", "WEB前端开发", "网页开发", "iOS开发"};
        for (int i = 0; i < 6; i++) {
            Simulation simulation = new Simulation(data[i]);
            list.add(simulation);
        }

        searchAdapter = new SearchAdapter(this, list, new SearchAdapter.FilterListener() {
            @Override
            public void getFilterData(List<Simulation> list) {
                //这里可以拿到过滤后的数据,所以在这里可以对搜索后的数据进行操作
                Log.e(TAG, "接口回调成功");
                Log.e(TAG, list.toString());
                setItemClick(list);
            }
        });
        //设置适配器
        listView.setAdapter(searchAdapter);
        //设置监听
        setListeners();
    }

    private void setListeners() {
        //没有进行搜索的时候,也要添加对listView的item单击监听
        setItemClick(list);
        
        et_search.addTextChangedListener(new TextWatcher() {
            //每次EditText文本改变之前的时候,会回调这个方法
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                //s     输入框中改变前的字符串信息
                //start 输入框中改变前的字符串的起始位置
                //count 输入框中改变前后的字符串改变数量一般为0
                //after 输入框中改变后的字符串与起始位置的偏移量
            }
            //每次EditText文本改变的时候,会回调这个方法
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                //第一个参数s 的含义: 输入框中改变后的字符串信息
                //start 输入框中改变后的字符串的起始位置
                //before 输入框中改变前的字符串的位置 默认为0
                //count 输入框中改变后的一共输入字符串的数量
                if (searchAdapter != null) {
                    searchAdapter.getFilter().filter(s);
                }
            }
            //每次EditText文本改变之后的时候,会回调这个方法
            @Override
            public void afterTextChanged(Editable s) {
                //edit  输入结束呈现在输入框中的信息
            }
        });
    }

    private void setItemClick(List<Simulation> filter_list) {
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(SearchBoxActivity.this, filter_list.get(position).getText(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

这样就实现了模拟搜索的功能,并且在代码中已经给出了详细的注释。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: Android实现模拟搜索功能

本文链接: https://www.lsjlt.com/news/132632.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android实现模拟搜索功能
    本文实例为大家分享了Android实现模拟搜索功能的具体代码,供大家参考,具体内容如下 先看效果图,合适了再接着往下看: 我们看到的这个页面,是由两部分组成,顶部的自定义的搜索框,...
    99+
    2022-11-12
  • android怎么实现搜索功能
    要实现Android应用的搜索功能,你可以按照以下步骤进行操作: 创建一个搜索框:在你的布局文件中添加一个EditText或Se...
    99+
    2023-10-26
    android
  • Android实现实时搜索框功能
    AutoCompleteTextView,自动完成文本框。用于实现允许用户输入一定字符后,显示一个下拉菜单,供用户从中选择,当用户选择某个选项后,按用户选择自动填写该文本框。该组件继承EditText,所以它支持EditText组件提供的属...
    99+
    2023-05-30
    android 搜索框 roi
  • 自定义搜索功能Android实现
    先看看效果图: 源码下载:自定义搜索功能 代码: SearchActivity.java package com.bzu.gxs.search.activity; impo...
    99+
    2022-06-06
    自定义 Android
  • Android中怎么实现poi搜索功能
    Android中怎么实现poi搜索功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。第一,就是设置背景的drawable为纯白色导致键盘弹出的时候,recyclerview...
    99+
    2023-05-30
    android
  • Android实现简单动态搜索功能
    目录前言一、addTextChangedListener二、本文案例1.介绍一下SearchView的一些方法2.准备数据3.初始化以及填充数据4.在SearchView中用户输入字...
    99+
    2022-11-13
  • 小程序模实现糊搜索功能
    本文实例为大家分享了小程序模实现糊搜索功能的具体代码,供大家参考,具体内容如下 1.写好页面布局 <!--搜索--> <view class="searchbox"...
    99+
    2022-11-13
  • Android实现高亮搜索功能的示例
    目录首先看效果图:使用方法:1、普通场景使用2、在DataBinding中使用首先看效果图: 整词高亮: 分词高亮: 下面贴上我封的方法 fun stringToHig...
    99+
    2022-11-12
  • Android ListView用EditText实现搜索功能效果
    前言 最近在开发一个IM项目的时候有一个需求就是,好友搜索功能。即在EditText中输入好友名字,ListView列表中动态展示刷选的好友列表。我把这个功能抽取出来了,先贴一...
    99+
    2022-06-06
    edittext listview Android
  • Android实现搜索功能并本地保存搜索历史记录
    本文实例为大家分享了Android实现搜索功能,并且需要显示搜索的历史记录,供大家参考,具体内容如下 效果图: 本案例实现起来很简单,所以可以直接拿来嵌入项目中使用,涉及到的...
    99+
    2022-06-06
    Android
  • 前端怎么实现搜索功能模块
    本篇内容介绍了“前端怎么实现搜索功能模块”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!用户使用产品,享受功...
    99+
    2022-10-19
  • java怎么实现搜索框搜索功能
    要实现搜索框搜索功能,可以按照以下步骤进行:1. 在前端页面上创建一个搜索框,如一个文本框和一个按钮。2. 在后端创建一个处理搜索请...
    99+
    2023-09-26
    java
  • Android怎么实现简单动态搜索功能
    本篇内容介绍了“Android怎么实现简单动态搜索功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言提到Android的动态搜索,大多应...
    99+
    2023-06-30
  • 小程序如何实现模糊搜索功能
    本文小编为大家详细介绍“小程序如何实现模糊搜索功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“小程序如何实现模糊搜索功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。写好页面布局<!--搜索-->...
    99+
    2023-07-02
  • vue实现搜索小功能
    本文实例为大家分享了vue实现搜索小功能的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> ...
    99+
    2022-11-12
  • Android中怎么实现淘宝搜索联想功能
    Android中怎么实现淘宝搜索联想功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。思考当搜索词为空时,不应该发起网络请求。在用户连续输入的情况下,可能会发起某些不必要的...
    99+
    2023-05-30
    android
  • android实现搜索功能并将搜索结果保存到SQLite中(实例代码)
    运行结果: 涉及要点: ListView+EditText+ScrollView实现搜索效果显示 监听软键盘回车执行搜索 使用TextWatcher( )实时筛...
    99+
    2022-06-06
    SQLite Android
  • javaweb搜索功能如何实现
    要实现JavaWeb的搜索功能,可以按照以下步骤进行:1. 建立数据库:创建一个适合存储搜索内容的数据库表。例如,可以创建一个包含标...
    99+
    2023-09-21
    javaweb
  • Android流式布局实现历史搜索记录功能
    最近在开发项目的时候,有一个需求是展示历史搜索记录 ,展示的样式是流式布局(就是根据内容自动换行)。在网上看到了一个不错的类库跟大家分享一下首先在AndroidStudio简历一个工程项目导入module类库,我会把项目demo方法GitH...
    99+
    2023-05-31
    android 流式布局 roi
  • Android 模拟地图定位功能的实现
    实现原理: 手机定位方式目前有4种: 基站定位WIFI定位GPS定位AGPS定位 本工程利用手机自带的"模拟位置"功能实现运行时修改LocationManager...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作