• 简介

    在我们平常上网的时候经常会用到谷歌或百度,在输入框中输入我们想要输入的信息就会出现其他与其相关的提示信息,非常方便。这种效果在 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. Curse of Dimensionality

    Curse of Dimensionality Curse of Dimensionality refers to non-intuitive properties of data observed ...

  2. 树链剖分 - BZOJ 1036: [ZJOI2008]树的统计Count

    这是树链剖分的入门题,也是我学树链剖分的第一题. 树链剖分:就是把树中和线段树联系起来,求(u,v)路径中权值的最大值和其路径的权值和. 入门blog:http://blog.sina.com.cn/ ...

  3. HDOJ 3183 A Magic Lamp

    A Magic Lamp Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  4. Unity3D研究院之静态自动检查代码缺陷与隐患

    原地址:原地址:http://www.xuanyusong.com/archives/2828 代码缺陷和代码错误的最大区别是,代码缺陷不影响游戏编译,而代码错误编译都不通过.但是代码缺陷会影响游戏发 ...

  5. POJ 2105

    #include <iostream> #include <cmath> #include <string> using namespace std; int ma ...

  6. POJ 3301 Texas Trip (三分)

    题目链接 题意 : 给你若干个点,让你找最小的正方形覆盖这所有的点.输出面积. 思路 : 三分枚举正方形两对边的距离,然后求出最大,本题用的是旋转正方形,也可以用旋转点,即点的相对位置不变. 正方形从 ...

  7. Gradle Goodness: Rename Ant Task Names When Importing Ant Build File

    Migrating from Ant to Gradle is very easy with the importBuild method from AntBuilder. We only have ...

  8. 小奇模拟赛9.13 by hzwer

    2015年9月13日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿(explo) [题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞 ...

  9. 李洪强经典iOS面试题11

        #import 跟#include 又什么区别,@class呢, #import<> 跟 #import””又什么区别? #import是Objective-C导入头文件的关键字, ...

  10. phpeclipse常用快捷键

    phpeclipse常用快捷键