android动态搜索的简单实现(代码片段)

计蒙不吃鱼 计蒙不吃鱼     2022-12-28     634

关键词:

系列文章目录

Android动态搜索的简单实现


文章最后有源码


前言

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

效果图:


一、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="http://schemas.android.com/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使用edittext+listview实现搜索效果(使用room模糊查询)(代码片段)

系列文章目录Android使用EditText+Listview实现搜索效果(使用room模糊查询)文章目录系列文章目录前言一、room的模糊查询语句二、布局的简单美化1.Listview去除item间的分割线和滑动的光标2.EditText去除下划线并为键盘回车... 查看详情

有点深度的聊聊jdk动态代理(代码片段)

...。于是,大家会通过搜索引擎,知道了一个陌生的名词:动态代理,慢慢的又知道了动态代理有多种实现方式,比如JDK动态代理,Cglib等等。今天我就来简单说说JDK动态代理。JDK动态代理的简单应用我们还是从一个最简单的例子... 查看详情

一个简单的动态代理实现(代码片段)

接口:1packagespring.aop;23publicinterfaceArithmetic45Integeradd(Integera,Integerb);6Integersub(Integera,Integerb);78目标:1packagespring.aop;23publicclassArithmeticImplimplementsArithmetic45@Override6pu 查看详情

pythonpython中二进制搜索树的简单实现(代码片段)

查看详情

用cmd命令实现一个简单的网页搜索(代码片段)

...搞的,今天无意找到了原理其实就是跳转到了百度的搜索页。代码如下:@echoofftitle搜索color03mode80,20echo《——————————————————————————————————————》set/pa=请输入你要搜索的内... 查看详情

android开源库:手把手教你实现一个简单好用的搜索框(含历史搜索记录)(代码片段)

前言Android开发中,类似下图的搜索功能非常常见今天,我将手把手教大家实现一款封装了历史搜索记录功能&样式的Android自定义搜索框开源库,希望你们会喜欢。已在Github开源:地址:SearchView,欢迎Star... 查看详情

django中q搜索的简单应用(代码片段)

...列化(由后端扔给前端的数据必然会经过序列化)3.前端动态地构造表格以便显示(动态创建DOM对象)思路:用户通过前端查询数据库内容时,可添加多个搜索框,一个搜索框内可以输入多个条件。同一搜索框内的条件是或OR关... 查看详情

搜索二叉树应用——简单字典实现(代码片段)

搜索二叉树基本概念请看上篇博客这两个问题都是典型的K(key)V(value)问题,我们用KV算法解决。判断一个单词是否拼写正确:假设把所有单词都按照搜索树的性质插入到搜索二叉树中,我们判断一个单词拼写是否正确就是在... 查看详情

java通过jdk动态代理简单的实现一个aop(代码片段)

首先说一下,因为自己还没有去研读spring的AOP的源码,只是大致知道其功能,便想着自己先手动实现一个先看看,觉得这样以后研读源码的时候会收获更多!实现:做一个在添加注解的方法执行之前,可以先执行另一个方法。类... 查看详情

简单jdk动态代理(代码片段)

在学习动态代理之前,最好先去理解静态代理,如果未曾了解过静态代理,建议先理解静态代理。在静态代理中,你需要自己去写一个代理类和被代理类实现相同的接口,在代理类中写上代理逻辑,确定要代理哪些方法,如果有... 查看详情

android权限动态请求(代码片段)

在AndroidM版本以后,权限就没办法Manifest声明就万事了,还需要动态请求。网上已经有不少例子,不过这里还是做一个简单的activity,把动态请求的方法,完整的实现一下,基本可以复制粘贴使用。首先࿰... 查看详情

简单动态规划(代码片段)

...度,自己还是蒟蒻(巨弱)啊这次学到的是一道区域型的动态规划问题吧,虽然对很多人来说很简单 一开都没啥思路就会画个图后面看了题解才知道要用到动态规划,可是还是不会啊然后去了解了下,啥叫动态规划问题动态... 查看详情

django博客实现简单的全文搜索(代码片段)

...文中所涉及的示例代码,已同步更新到HelloGitHub-Team仓库搜索是一个复杂的功能,但对于一些简单的搜索任务,我们可以使用DjangoModel层提供的一些内置方法来完成。现在我们来为我们的博客提供一个简单的搜索功能。概述博客文... 查看详情

android实现搜索关键字高亮显示+listview的功能(代码片段)

一、测试实现:二、准备工作1.文字变色工具类KeyWordUtil.javapublicclassKeyWordUtil/***关键字高亮变色**@paramcolor变化的色值*@paramtext文字*@paramkeyword文字中的关键字*@return结果SpannableString*/publicstaticSpannableStringma 查看详情

android可拖拽view的简单实现(代码片段)

其实Android可拖拽View实现起来很简单,最简单的就是实现View的setOnTouchListener方法。下面这段代码就实现了如下两个功能:1、View随着手指的拖动儿拖动。2、当松开手指的时候,如果View在屏幕的右半边,则自动让其贴到屏幕右边... 查看详情

android可拖拽view的简单实现(代码片段)

其实Android可拖拽View实现起来很简单,最简单的就是实现View的setOnTouchListener方法。下面这段代码就实现了如下两个功能:1、View随着手指的拖动儿拖动。2、当松开手指的时候,如果View在屏幕的右半边,则自动让其贴到屏幕右边... 查看详情

文件搜索工具(python实现)(代码片段)

文章目录文件搜索工具介绍代码实现实现思路os.walk函数os.path.join函数代码整体编写打包成exe程序效果展示文件搜索工具介绍文件搜索工具能够基于名称快速定位匹配的文件和文件夹位置,比如Everything就是Windows上的一款文件... 查看详情

封装一个简单的动态数组(代码片段)

packagecom.immoc;importjava.util.ArrayList;importjava.util.List;/***实现动态数组**/publicclassArray<E>privateE[]data;;privateintsize;publicArray(intcapacity)data=(E[])newObject[capacity];size=0;pub 查看详情