Android用AutoCompleteTextView实现搜索历史记录提示

  • 简介

    在我们平常上网的时候经常会用到谷歌或百度,在输入框中输入我们想要输入的信息就会出现其他与其相关的提示信息,非常方便。这种效果在 Android中是用AutoCompleteTextView实现的,AutoCompleteTextView是一个可以编辑的文本view,当用户 键入时,会自动显示完成建议信息。

    建议列表显示在下拉列表框中,可以选中某项代替编辑框里的内容。

    当用户点击回车键时,或者什么也没有选中点击ENTER建时下拉列表会自动消失。

    建议列表是从一个数据适配器获取的数据。

    step1:新建一个项目AutoComplete

    step2:设计应用的UI界面   /layout/main.xml

    [html]

    <?xml version="1.0" encoding="utf-8"?>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

    <!--  当之有一个EditText或者AutoCompleteTextView的时候,进入画面时是默认得到焦点的。

    要想去除焦点,可以在auto之前加一个o像素的layout,并设置他先得到焦点。 -->

    <LinearLayout android:layout_width="0px"

    android:layout_height="0px" android:focusable="true"

    android:focusableInTouchMode="true"></LinearLayout>

    <!-- 定义一个自动完成文本框,指定输入一个字符后进行提示 -->

    <AutoCompleteTextView

    android:id="@+id/auto"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:hint="请输入文字进行搜索"

    android:completionHint="最近的5条记录"

    android:dropDownHorizontalOffset="20dp"

    android:completionThreshold="1"

    android:dropDownHeight="fill_parent"/>

    <!--

    android:completionHint            设置出现在下拉菜单中的提示标题

    android:completionThreshold       设置用户至少输入多少个字符才会显示提示

    android:dropDownHorizontalOffset  设置下拉菜单于文本框之间的水平偏移。下拉菜单默认与文本框左对齐

    android:dropDownVerticalOffset    设置下拉菜单于文本框之间的垂直偏移。下拉菜单默认紧跟文本框

    android:dropDownHeight               设置下拉菜单的高度

    android:dropDownWidth                设置下拉菜单的宽度

    -->

    <Button android:text="搜索" android:id="@+id/search"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"/>

    </LinearLayout>

    step3:MainActivity.java

    [java]

    package cn.roco.autocomplete;

    import android.app.Activity;

    import android.content.SharedPreferences;

    import android.os.Bundle;

    import android.view.View;

    import android.view.View.OnClickListener;

    import android.view.View.OnFocusChangeListener;

    import android.widget.ArrayAdapter;

    import android.widget.AutoCompleteTextView;

    import android.widget.Button;

    public class MainActivity extends Activity {

    private AutoCompleteTextView autoCompleteTextView;

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    autoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.auto);

    initAutoComplete("history", autoCompleteTextView);

    Button searchButton = (Button) findViewById(R.id.search);

    searchButton.setOnClickListener(new MyOnClickListener());

    }

    private final class MyOnClickListener implements OnClickListener {

    @Override

    public void onClick(View v) {

    saveHistory("history", autoCompleteTextView);

    }

    }

    /**

    * 把指定AutoCompleteTextView中内容保存到sharedPreference中指定的字符段

    *

    * @param field

    *            保存在sharedPreference中的字段名

    * @param autoCompleteTextView

    *            要操作的AutoCompleteTextView

    */

    private void saveHistory(String field,

    AutoCompleteTextView autoCompleteTextView) {

    String text = autoCompleteTextView.getText().toString();

    SharedPreferences sp = getSharedPreferences("network_url", 0);

    String longhistory = sp.getString(field, "nothing");

    if (!longhistory.contains(text + ",")) {

    StringBuilder sb = new StringBuilder(longhistory);

    sb.insert(0, text + ",");

    sp.edit().putString("history", sb.toString()).commit();

    }

    }

    /**

    * 初始化AutoCompleteTextView,最多显示5项提示,使 AutoCompleteTextView在一开始获得焦点时自动提示

    *

    * @param field

    *            保存在sharedPreference中的字段名

    * @param autoCompleteTextView

    *            要操作的AutoCompleteTextView

    */

    private void initAutoComplete(String field,

    AutoCompleteTextView autoCompleteTextView) {

    SharedPreferences sp = getSharedPreferences("network_url", 0);

    String longhistory = sp.getString("history", "nothing");

    String[] histories = longhistory.split(",");

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,

    android.R.layout.simple_dropdown_item_1line, histories);

    // 只保留最近的50条的记录

    if (histories.length > 50) {

    String[] newHistories = new String[50];

    System.arraycopy(histories, 0, newHistories, 0, 50);

    adapter = new ArrayAdapter<String>(this,

    android.R.layout.simple_dropdown_item_1line, newHistories);

    }

    autoCompleteTextView.setAdapter(adapter);

    autoCompleteTextView

    .setOnFocusChangeListener(new OnFocusChangeListener() {

    @Override

    public void onFocusChange(View v, boolean hasFocus) {

    AutoCompleteTextView view = (AutoCompleteTextView) v;

    if (hasFocus) {

    view.showDropDown();

    }

    }

    });

    }

    }

    step4:部署应用到模拟器中

    step5:进行几次输入,并点击搜索按钮保存历史记录后,退出应用再重新进入应用

    step6:这个时候再进行搜索就会有自动补全的效果:

                

    附注:

    熟悉android列表开发的话,对于Adapter应该非常熟悉,上面的实例代码,使用了android提供的ArrayAdapter,给予AutoCompleteTextView 绑定数据与视图,我们要定制,首先从这里开始。

    和其他Adaper一样,ArrayAdapter的基类也是BaseAdapter,我们可以定制自己的Adapter了。

    可是一运行,木有反应,没有一点提示?

    的确,我们的视图与数据是绑定了,可是AutoCompleteTextView 却不能根据我们的Adapter获取到合适的数据,因为adapter不符合要求!

    我们反过来再研究一下ArrayAdapter,它除了是BaseAdapter的子类,它还实现了 Filterable 接口!

    我们在AutoAdapter中,实现该接口,并返回一个自定义的 Filter

    那个AutoMailFilter又是一个什么样子的类呢?

    先细细想想 AutoCompleteTextView 是怎样工作的,对,它只是对我们所输入的一些字符,进行过滤、索引,并组成相应的视图反馈给我们的用户,以提高我们的输入效率!

    那接下来就是构建核心过滤器的时候了,AutoCompleteTextView 只会接收过滤后的数据,所以我们的数据源会多出一份拷贝,一份是原始的,一份则是过滤后的:

    在AutoMailFilter里面,由于继承了,我们必须实现两个重要的方法:

    protected FilterResults performFiltering(CharSequence prefix)

    在这个方法里面定制过滤策略,根据输入的prefix对数据进行过滤,并组装成FilterResults 结果返回;

    protected void publishResults(CharSequence constraint, FilterResults results)

    这个方法则是发布结果用的,把上面方法的结果按照一定的要求进行处理后,通知Adapter进行数据视图的刷新

    总结:

    按照 AutoCompleteTextView 的工作流程,它依赖两个组件,Adapter 和 Filter,一个是视图的处理,一个是数据过滤处理,对这两个组件进行深度定制,我们就可以随心所欲了。

时间: 2025-01-02 01:15:26

Android用AutoCompleteTextView实现搜索历史记录提示的相关文章

Android搜索自动提示功能 AutocompleteTextView

1.配置main.xml中自动提示控件: <AutoCompleteTextView android:id="@+id/autotv_searchresult" android:layout_width="280dip" android:layout_height="35dip" android:layout_centerInParent="true" android:background="#00000000

android 中使用AutoCompleteTextView 可以实现自动提示功能

在java文档中预先设置好需要提示的字串,默认设置是输入两个字符的时候提醒,但是可以在java文件里面使用setThreshold() 方法实现更改提醒是输入的字符数,但是提醒的文字需要预先匹配 附上代码: xml文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= "http://schemas.android.com/tools"

29.Android之文本框输入自动提示学习

我们在用百度.淘宝等之类搜索输入一些字符时,会自动弹出一个下拉框提示类似的结果.在Android中提供了两种智能输入框,它们是AutoCompleteTextView.MultiAutoCompleteTextView,今天来学习下. AutoCompleteTextView.MultiAutoCompleteTextView二者区别是前者选择一个,后者可以选择多个. 直接上代码,首先改下xml文件: 1 <?xml version="1.0" encoding="ut

Android自定义View——自定义搜索框(SearchView)

概述 在Android开发中,当系统数据项比较多时,常常会在app添加搜索功能,方便用户能快速获得需要的数据.搜索栏对于我们并不陌生,在许多app都能见到它,比如豌豆荚 在某些情况下,我们希望我们的自动补全信息可以不只是纯文本,还可以像豌豆荚这样,能显示相应的图片和其他数据信息,因此Android给我们提供的AutoCompleteTextView往往就不够用,在大多情况下我们都需要自己去实现搜索框. 分析 根据上面这张图,简单分析一下自定义搜索框的结构与功能,有 1. 搜索界面大致由三部门组成

android中实现内容搜索

在编写android搜索代码的时候,怎样去实现搜索功能,考虑中的有两种: 自己定义搜索方法: 1.自己定义搜索输入框,搜索图标,搜索button 2.自己定义语音输入方法 3.自己定义经常使用热词内容.样式 4.自己定义浏览记录内容和样式 5.自己定义弹出样式使用spinner配合listView 6.自己定义数据源格式和搜索算法 自己定义搜索相比还是比較复杂,须要我们思考比較多. Android自带的搜索方法: 1.创建一个搜索对话框配置文件 2.创建一个可用于搜索的Acitivity和运行搜

Android之自动文本输入识别提示

相信大家都熟悉自动识别提示吧,在我们的生活中随处可见,今天就让我为大家简单介绍一下它是如何设计的. 所谓自动识别输入即是根据用户输入的已有信息,为用户提示可能的值,方便用户完成输入.在Android设备上这种功能分为:AutoCompleteTextView和MultiAutoCompleteTextView,前者为单个的自动识别,类似与搜索引擎的输入框提示:后者为多个值自动识别,类似与发邮件时的邮箱输入框.那它们俩到底如何使用呢?下面就让我们一起学习一下吧. 首先是布局文件: <Relativ

Android Studio如何设置代码自动提示

在用Eclipse时候,你可以进行设置,设置成不管你输入任何字母,都能进行代码的提示,在Android Studio中也可以 设置,而且比Eclipse设置来的简单.当然如果你觉得代码自动提示会降低你的代码水平,你也可以不设置,在写代码 过程中,如果一时忘记了,你就可以用代码提示的快捷键.android studio代码提示的快捷键是什么呢?看这篇文章: [Android Studio快捷键]之代码提示 接下来说如何设置代码自动提示,如图: 图上内容比较多,我直接按区域划分成6块区域来说吧: 区

Android Studio如何设置自己主动提示代码

同Eclipse时间,您可以设置,无论你是设置输入不管什么信,可以提示码,在Android Studio也可以 设置.并且比Eclipse设置来的简单. 当然假设你认为代码自己主动提示会减少你的代码水平.你也能够不设置,在写代码 过程中,假设一时忘记了,你就能够用代码提示的快捷键. android studio代码提示的快捷键是什么呢?看这篇文章: [Android Studio快捷键]之代码提示 接下来说怎样设置代码自己主动提示.如图: 图上内容比較多,我直接按区域划分成6块区域来说吧: 区域

**IOS自动完成(搜索自动提示)功能实现

UISearchBar搜索AutoComplete下拉列表搜索提示 http://www.codeios.com/thread-10685-1-1.html 介绍: 在搜索框上加入下拉列表.在搜索框上面输入文字时,出现下拉列表,可以用作搜索自动提示. 测试环境: [Code4App]编译测试,测试环境:Xcode 4.3, iOS 5.0. http://code4app.com/ios/Drop-Down-List/5002d3706803faf208000000