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><!-- 定义一个自动完成文本框,指定输入一个字符后进行提示 --><AutoCompleteTextViewandroid: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;@Overridepublic 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 {@Overridepublic 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() {@Overridepublic 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实现搜索历史记录提示的更多相关文章
- Android搜索自动提示功能 AutocompleteTextView
1.配置main.xml中自动提示控件: <AutoCompleteTextView android:id="@+id/autotv_searchresult" androi ...
- Android开发(30)--AutoCompleteTextView和MultiAutoCompleteTextView自动提示输入内容
首先大家都见过类似这种效果, AutoCompleteTextView是实现动态匹配输入的内容 下面就通过一个实例来说明AutoCompleteTextView,同样,AutoCompleteText ...
- 用AutoCompleteTextView实现历史记录提示
自定义AutoCompleteTextView 博客分类: android进阶 android 网上找到的都是同ArrayAdapter一起使用的,有时候需要自定义风格,咋办?follow me! ...
- 从头学起android<AutoCompleteTextView文章提示文本框.十九.>
文章提示可以很好的帮助用户输入信息,以方便.在Android它也设置有类似特征,而要实现这个功能需要依靠android.widget.AutoCompleteTextView完毕,此类的继承结构例如以 ...
- AutoCompleteTextView实现搜索提示功能的实现
AutoCompleteTextView和EditText组件类似,都可以输入文本.但AutoCompleteTextView组件可以和一个字符串数组或List对象绑定,当用户输入两个及以上字符时,系 ...
- Android课程---关于下拉列表与状态栏提示的学习
activity_ui7.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout x ...
- Android之自动文本输入识别提示
相信大家都熟悉自动识别提示吧,在我们的生活中随处可见,今天就让我为大家简单介绍一下它是如何设计的. 所谓自动识别输入即是根据用户输入的已有信息,为用户提示可能的值,方便用户完成输入.在Android设 ...
- Android Studio如何设置代码自动提示
在用Eclipse时候,你可以进行设置,设置成不管你输入任何字母,都能进行代码的提示,在Android Studio中也可以 设置,而且比Eclipse设置来的简单.当然如果你觉得代码自动提示会降低你 ...
- Android Studio如何设置自己主动提示代码
同Eclipse时间,您可以设置,无论你是设置输入不管什么信,可以提示码,在Android Studio也可以 设置.并且比Eclipse设置来的简单. 当然假设你认为代码自己主动提示会减少你的代码水 ...
随机推荐
- JavaScript之With语句讲解
有了With 语句,在存取对象属性和方法时就不用重复指定参考对象,在 With 语句块中,凡是 JavaScript 不识别的属性和方法都和该语句块指定的对象有关.With 语句的语法格式如下所示:W ...
- UglifyJS--javascript代码压缩使用指南{转}
在线测试地址 http://lisperator.net/uglifyjs/下面都是基于linux系统的安装使用.UglifyJS是遵循了CommonJS规范写成的,可以在支持CommonJS模块系统 ...
- Unity 处理策划的 Excel
很多时候我们需要使用策划的Excel表来做游戏的静态数据配置, 而不是采用自己定义的xml或者U3D的scriptobject. 因为很多数据都是策划处理的,而策划最喜欢的就是excel,也只会用这个 ...
- Java日志记录的事儿
一.java日志组件 1.common-logging common-logging是apache提供的一个通用的日志接口.用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的 ...
- Android 4.4KitKat AudioRecord 流程分析
Android是架构分为三层: 底层 Linux Kernel 中间层 主要由C++实现 (Android 60%源码都是C++实现) 应用层 主要由JAVA开发的应用程序 应用程序执行 ...
- CSS 的overflow:hidden 属性详细解释
overflow:hidden这个CSS样式是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出, 而对于清除浮动这个含义不是很了解.一提到清除浮动,我们就会想到另外一个CSS样式 ...
- elasticsearch 八、重要的配置更改
http://jingyan.baidu.com/article/7908e85c9fc626af491ad263.html
- Windbg 常用命令整理
kd> !idt -a 查看idt kd> dt _ktrap_frame 异常帧 kd> ba e1 Address 下硬件执行断点kd> ba w4 Addr ...
- LoadRunner8 安装步骤
一.介绍 LoadRunner,是一种预测系统行为和性能的负载测试工具.通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试.企业使用L ...
- QScrollArea可以帮助我们实现让一个widget的内容带有滚动条(QWidget里内置QScrollArea,QScrollArea里再内置其它QWidget)
使用QScrollArea可以帮助我们实现让一个widget的内容带有滚动条,用户可以通过拖动滚动条来查看更多内容, 代码示例如下: 1.带有滚动条的widget列表 #include "w ...