打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
我的Android进阶之旅

简介 

在我们平常上网的时候经常会用到谷歌或百度,在输入框中输入我们想要输入的信息就会出现其他与其相关的提示信息,非常方便。这种效果在Android中是用AutoCompleteTextView实现的,AutoCompleteTextView是一个可以编辑的文本view,当用户键入时,会自动显示完成建议信息。 
建议列表显示在下拉列表框中,可以选中某项代替编辑框里的内容。 
当用户点击回车键时,或者什么也没有选中点击ENTER建时下拉列表会自动消失。 
建议列表是从一个数据适配器获取的数据。 


step1:新建一个项目AutoComplete


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

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7.     <!--  当之有一个EditText或者AutoCompleteTextView的时候,进入画面时是默认得到焦点的。  
  8.           要想去除焦点,可以在auto之前加一个o像素的layout,并设置他先得到焦点。 -->  
  9.     <LinearLayout android:layout_width="0px"    
  10.         android:layout_height="0px" android:focusable="true"    
  11.         android:focusableInTouchMode="true"></LinearLayout>    
  12.       
  13.     <!-- 定义一个自动完成文本框,指定输入一个字符后进行提示 -->  
  14.     <AutoCompleteTextView    
  15.         android:id="@+id/auto"  
  16.         android:layout_width="fill_parent"   
  17.         android:layout_height="wrap_content"   
  18.         android:hint="请输入文字进行搜索"  
  19.         android:completionHint="最近的5条记录"  
  20.         android:dropDownHorizontalOffset="20dp"  
  21.         android:completionThreshold="1"  
  22.         android:dropDownHeight="fill_parent"/>  
  23.           
  24.         <!--   
  25.         android:completionHint            设置出现在下拉菜单中的提示标题  
  26.         android:completionThreshold       设置用户至少输入多少个字符才会显示提示  
  27.         android:dropDownHorizontalOffset  设置下拉菜单于文本框之间的水平偏移。下拉菜单默认与文本框左对齐  
  28.         android:dropDownVerticalOffset    设置下拉菜单于文本框之间的垂直偏移。下拉菜单默认紧跟文本框  
  29.         android:dropDownHeight               设置下拉菜单的高度  
  30.         android:dropDownWidth                设置下拉菜单的宽度  
  31.         -->  
  32.      <Button android:text="搜索" android:id="@+id/search"    
  33.         android:layout_width="wrap_content"    
  34.         android:layout_height="wrap_content"/>     
  35. </LinearLayout>  


step3:MainActivity.java

  1. package cn.roco.autocomplete;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.SharedPreferences;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.view.View.OnFocusChangeListener;  
  9. import android.widget.ArrayAdapter;  
  10. import android.widget.AutoCompleteTextView;  
  11. import android.widget.Button;  
  12.   
  13. public class MainActivity extends Activity {  
  14.   
  15.     private AutoCompleteTextView autoCompleteTextView;  
  16.   
  17.     @Override  
  18.     public void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.main);  
  21.   
  22.         autoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.auto);  
  23.         initAutoComplete("history", autoCompleteTextView);  
  24.         Button searchButton = (Button) findViewById(R.id.search);  
  25.         searchButton.setOnClickListener(new MyOnClickListener());  
  26.     }  
  27.   
  28.     private final class MyOnClickListener implements OnClickListener {  
  29.         @Override  
  30.         public void onClick(View v) {  
  31.             saveHistory("history", autoCompleteTextView);  
  32.         }  
  33.     }  
  34.   
  35.     /** 
  36.      * 把指定AutoCompleteTextView中内容保存到sharedPreference中指定的字符段 
  37.      *  
  38.      * @param field 
  39.      *            保存在sharedPreference中的字段名 
  40.      * @param autoCompleteTextView 
  41.      *            要操作的AutoCompleteTextView 
  42.      */  
  43.     private void saveHistory(String field,  
  44.             AutoCompleteTextView autoCompleteTextView) {  
  45.         String text = autoCompleteTextView.getText().toString();  
  46.         SharedPreferences sp = getSharedPreferences("network_url", 0);  
  47.         String longhistory = sp.getString(field, "nothing");  
  48.         if (!longhistory.contains(text + ",")) {  
  49.             StringBuilder sb = new StringBuilder(longhistory);  
  50.             sb.insert(0, text + ",");  
  51.             sp.edit().putString("history", sb.toString()).commit();  
  52.         }  
  53.     }  
  54.   
  55.     /** 
  56.      * 初始化AutoCompleteTextView,最多显示5项提示,使 AutoCompleteTextView在一开始获得焦点时自动提示 
  57.      *  
  58.      * @param field 
  59.      *            保存在sharedPreference中的字段名 
  60.      * @param autoCompleteTextView 
  61.      *            要操作的AutoCompleteTextView 
  62.      */  
  63.     private void initAutoComplete(String field,  
  64.             AutoCompleteTextView autoCompleteTextView) {  
  65.         SharedPreferences sp = getSharedPreferences("network_url", 0);  
  66.         String longhistory = sp.getString("history", "nothing");  
  67.         String[] histories = longhistory.split(",");  
  68.         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,  
  69.                 android.R.layout.simple_dropdown_item_1line, histories);  
  70.         // 只保留最近的50条的记录  
  71.         if (histories.length > 50) {  
  72.             String[] newHistories = new String[50];  
  73.             System.arraycopy(histories, 0, newHistories, 0, 50);  
  74.             adapter = new ArrayAdapter<String>(this,  
  75.                     android.R.layout.simple_dropdown_item_1line, newHistories);  
  76.         }  
  77.         autoCompleteTextView.setAdapter(adapter);  
  78.         autoCompleteTextView  
  79.                 .setOnFocusChangeListener(new OnFocusChangeListener() {  
  80.                     @Override  
  81.                     public void onFocusChange(View v, boolean hasFocus) {  
  82.                         AutoCompleteTextView view = (AutoCompleteTextView) v;  
  83.                         if (hasFocus) {  
  84.                             view.showDropDown();  
  85.                         }  
  86.                     }  
  87.                 });  
  88.     }  
  89. }  

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,一个是视图的处理,一个是数据过滤处理,对这两个组件进行深度定制,我们就可以随心所欲了。



==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址http://blog.csdn.net/ouyang_peng

==================================================================================================


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
2.5.4 AutoCompleteTextView(自动完成文本框)的基本使用
一步一步android(9):关于界面控件的学习3【spinner、autocompletetextview、NotificationBar
Android Spinner的五个部分
Android 常用适配器总结
android Spinner控件详解
Spinner样式大全
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服