• 简介

    在我们平常上网的时候经常会用到谷歌或百度,在输入框中输入我们想要输入的信息就会出现其他与其相关的提示信息,非常方便。这种效果在 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,一个是视图的处理,一个是数据过滤处理,对这两个组件进行深度定制,我们就可以随心所欲了。

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

  1. Android搜索自动提示功能 AutocompleteTextView

    1.配置main.xml中自动提示控件: <AutoCompleteTextView android:id="@+id/autotv_searchresult" androi ...

  2. Android开发(30)--AutoCompleteTextView和MultiAutoCompleteTextView自动提示输入内容

    首先大家都见过类似这种效果, AutoCompleteTextView是实现动态匹配输入的内容 下面就通过一个实例来说明AutoCompleteTextView,同样,AutoCompleteText ...

  3. 用AutoCompleteTextView实现历史记录提示

    自定义AutoCompleteTextView 博客分类: android进阶 android  网上找到的都是同ArrayAdapter一起使用的,有时候需要自定义风格,咋办?follow me! ...

  4. 从头学起android&lt;AutoCompleteTextView文章提示文本框.十九.&gt;

    文章提示可以很好的帮助用户输入信息,以方便.在Android它也设置有类似特征,而要实现这个功能需要依靠android.widget.AutoCompleteTextView完毕,此类的继承结构例如以 ...

  5. AutoCompleteTextView实现搜索提示功能的实现

    AutoCompleteTextView和EditText组件类似,都可以输入文本.但AutoCompleteTextView组件可以和一个字符串数组或List对象绑定,当用户输入两个及以上字符时,系 ...

  6. Android课程---关于下拉列表与状态栏提示的学习

    activity_ui7.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout x ...

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

    相信大家都熟悉自动识别提示吧,在我们的生活中随处可见,今天就让我为大家简单介绍一下它是如何设计的. 所谓自动识别输入即是根据用户输入的已有信息,为用户提示可能的值,方便用户完成输入.在Android设 ...

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

    在用Eclipse时候,你可以进行设置,设置成不管你输入任何字母,都能进行代码的提示,在Android Studio中也可以 设置,而且比Eclipse设置来的简单.当然如果你觉得代码自动提示会降低你 ...

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

    同Eclipse时间,您可以设置,无论你是设置输入不管什么信,可以提示码,在Android Studio也可以 设置.并且比Eclipse设置来的简单. 当然假设你认为代码自己主动提示会减少你的代码水 ...

随机推荐

  1. 研究Dropbox Server端文件系统

    一.传统文件系统 可以理解成两部分:1.真正的storage区,被分割成n个扇区:2.文件系统,其实就是一个FAT表. 二.Dropbox的文件系统 例如,一个modeo.mov的文件,大小为15M. ...

  2. 无法解决 equal to 运算中 &quot;Chinese_PRC_CI_AS&quot; 和 &quot;SQL_Latin1_General_CP1_CI_AS&quot; 之间的排序规则冲突。

    什么是排序规则(collation) 关于SQL Server的排序规则,估计大家都不陌生,在创建数据库时我们经常要选择一种排序规则(conllation),一般我们会留意到每一种语言的排序规则都有许 ...

  3. 6 高级IO函数

    6.1 pipe函数 pipe函数创建一个管道,用于实现进程间通信 #include<unistd.h> ]); 参数包含两个文件描述符fd[0]和fd[1],往fd[1]写入的数据可以从 ...

  4. SOA之(2)——SOA架构基础概念与设计框架

    SOA的设计框架 设计框架与架构相关的概念紧密相连,原则.模式和架构始终是与设计共舞的. SOA服务设计的原则中记录了一个基础的设计框架: 设计特性(Design Characteristic)——由 ...

  5. Long型070000L前面0去掉比较大小,token,mysql innodb,properties,switch匹配空字符串对象

    public class TestJava { //定义获取资源文件 private static final ResourceBundle bundle = initBundle(); privat ...

  6. Sqli-labs less 65

    Less-65 $id = '"'.$id.'"'; // Querry DB to get the correct output $sql="SELECT * FROM ...

  7. asp.net 认证与授权

    1.下面的例子在web.config文件中配置网站使用asp.net forms 身份认证方式: <configuration> <system.web> <authen ...

  8. 10个免费开源的JS音乐播放器插件

    点这里 音乐播放器在网页设计中有时候会用到,比如一些时尚类.音乐或影视类等项目,但这些 网页播放器 插件比较少见,所以这里为大家整理一个集合,也许会有用到的时候. 下面整理的播放器有些是支持自适应的, ...

  9. ExtJs之Field.Trigger和Field.Spinner

    作文本框功能的. <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta h ...

  10. Linux之select系统调用_2

    在上一篇博文中,我们的程序中我们有3个客户端,因此也事先建立了3个管道,每个客户端分别使用一个管道向服务器发送消息.而在服务器端使用select系统调用,只要监测到某一管道有消息写入,服务器就将其re ...