博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我的Android进阶之旅------>Android用AutoCompleteTextView实现搜索历史记录提示
阅读量:6190 次
发布时间:2019-06-21

本文共 4592 字,大约阅读时间需要 15 分钟。

简介 

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

step1:新建一个项目AutoComplete

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

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

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

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

  转载请保留原文地址

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

转载于:https://www.cnblogs.com/ouyangpeng/archive/2013/04/19/8538390.html

你可能感兴趣的文章
CF633C:Spy Syndrome 2——题解
查看>>
POJ3070:Fibonacci——题解
查看>>
白盒测试实践作业进度报告——Day 3
查看>>
私有继承:派生类指针不能隐示的转换为基类指针
查看>>
Micropython 如何用Turnipbit做一个自动浇水装置
查看>>
Python 成仙之路
查看>>
HashTable Dictionary HashMap
查看>>
【翻译】如何创建Ext JS暗黑主题之一
查看>>
【OpenGL】详解第一个OpenGL程序
查看>>
设置ubuntu Android sdk JDK环境变量
查看>>
android应用程序的混淆打包
查看>>
创建可按比例调整的布局的 Windows 窗体
查看>>
关于web页面中<mata>各种标签的解释
查看>>
生成函数
查看>>
读书笔记--精通CSS高级Web标准解决方案(一)---CSS基础
查看>>
nodeJs express mongodb 建站(mac 版)
查看>>
【从0到1学Web前端】CSS定位问题二(float和display的使用) 分类: ...
查看>>
集合处理工具
查看>>
51单片机——蓝牙远程点灯
查看>>
sosoapi的安装
查看>>