AutoCompleteTextView 使用

AutoCompleteTextView与自定义Adapter实现自动补全 AutoCompleteTextView继承自TextView,是一种可以实现自动补全的功能的TextView。先看效果: 该功能在目前很常见,例如在用户进行登录的时候或者注册的时候都用到了这种功能,在Android中这样的效果我们可以借助AutoComleteTextView来实现。 为了实现补全功能AutoCompleteTextView需要和Adapter(适配器)一起使用。Andr 阅读详情

用AutoCompleteTextView实现历史记录提示

标签: layoutstringandroidfilterdropdownnetwork
  43153人阅读  评论(14)  收藏  举报
  分类:
 



        这画面不陌生吧,百度的提示,他的词库并不是历史记录,是搜索引擎收集的当前最常搜索的内容。假如我们也要在android的应用实现如上功能怎么做呢?
方法很简单,android已经帮我们写好了api ,这里就用到了AutoCompleteTextView组件。
       网上有不少教程,那个提示框字符集都是事先写好的,例如用一个String[] 数组去包含了这些数据,但是,我们也可以吧用户输入的作为历史记录保存
       下面先上我写的代码:

import android.app.Activity;
[java]  view plain  copy
  1. import android.content.SharedPreferences;  
  2. import android.os.Bundle;  
  3. import android.util.Log;  
  4. import android.view.View;  
  5. import android.view.View.OnClickListener;  
  6. import android.view.View.OnFocusChangeListener;  
  7. import android.widget.ArrayAdapter;  
  8. import android.widget.AutoCompleteTextView;  
  9. import android.widget.Button;  
  10.   
  11. public class Read_historyActivity extends Activity implements  
  12.         OnClickListener {  
  13.     private AutoCompleteTextView autoTv;  
  14.   
  15.     /** Called when the activity is first created. */  
  16.     @Override  
  17.     public void onCreate(Bundle savedInstanceState) {  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.main);  
  20.         autoTv = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1);  
  21.         initAutoComplete("history",autoTv);  
  22.         Button search = (Button) findViewById(R.id.button1);  
  23.         search.setOnClickListener(this);  
  24.     }  
  25.     @Override  
  26.     public void onClick(View v) {  
  27.         // 这里可以设定:当搜索成功时,才执行保存操作  
  28.         saveHistory("history",autoTv);  
  29.     }  
  30.   
  31.     /** 
  32.      * 初始化AutoCompleteTextView,最多显示5项提示,使 
  33.      * AutoCompleteTextView在一开始获得焦点时自动提示 
  34.      * @param field 保存在sharedPreference中的字段名 
  35.      * @param auto 要操作的AutoCompleteTextView 
  36.      */  
  37.     private void initAutoComplete(String field,AutoCompleteTextView auto) {  
  38.         SharedPreferences sp = getSharedPreferences("network_url", 0);  
  39.         String longhistory = sp.getString("history", "nothing");  
  40.         String[]  hisArrays = longhistory.split(",");  
  41.         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,  
  42.                 android.R.layout.simple_dropdown_item_1line, hisArrays);  
  43.         //只保留最近的50条的记录  
  44.         if(hisArrays.length > 50){  
  45.             String[] newArrays = new String[50];  
  46.             System.arraycopy(hisArrays, 0, newArrays, 0, 50);  
  47.             adapter = new ArrayAdapter<String>(this,  
  48.                     android.R.layout.simple_dropdown_item_1line, newArrays);  
  49.         }  
  50.         auto.setAdapter(adapter);  
  51.         auto.setDropDownHeight(350);  
  52.         auto.setThreshold(1);  
  53.         auto.setCompletionHint("最近的5条记录");  
  54.         auto.setOnFocusChangeListener(new OnFocusChangeListener() {  
  55.             @Override  
  56.             public void onFocusChange(View v, boolean hasFocus) {  
  57.                 AutoCompleteTextView view = (AutoCompleteTextView) v;  
  58.                 if (hasFocus) {  
  59.                         view.showDropDown();  
  60.                 }  
  61.             }  
  62.         });  
  63.     }  
  64.   
  65.   
  66.   
  67.     /** 
  68.      * 把指定AutoCompleteTextView中内容保存到sharedPreference中指定的字符段 
  69.      * @param field  保存在sharedPreference中的字段名 
  70.      * @param auto  要操作的AutoCompleteTextView 
  71.      */  
  72.     private void saveHistory(String field,AutoCompleteTextView auto) {  
  73.         String text = auto.getText().toString();  
  74.         SharedPreferences sp = getSharedPreferences("network_url", 0);  
  75.         String longhistory = sp.getString(field, "nothing");  
  76.         if (!longhistory.contains(text + ",")) {  
  77.             StringBuilder sb = new StringBuilder(longhistory);  
  78.             sb.insert(0, text + ",");  
  79.             sp.edit().putString("history", sb.toString()).commit();  
  80.         }  
  81. <span style="font-family: monospace; white-space: pre; background-color: rgb(240, 240, 240); "> }  
  82. }</span>  
               上面的代码我实现了autocomplettextview的从sharepreference中读取历史记录并显示的功能,当没有任何输入时,提示最新的5项历史记录(这里可以加个条件,当有历史记录时才显示)
              补上布局的代码
[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:orientation="vertical"  
  5.     android:layout_width="fill_parent"  
  6.     android:layout_height="fill_parent">  
  7.     <TextView android:layout_width="fill_parent"  
  8.         android:layout_height="wrap_content"  
  9.         android:text="@string/hello" />  
  10.     <LinearLayout android:layout_width="0px"  
  11.         android:layout_height="0px" android:focusable="true"  
  12.         android:focusableInTouchMode="true"></LinearLayout>  
  13.     <AutoCompleteTextView  
  14.         android:hint="请输入文字进行搜索" android:layout_height="wrap_content"  
  15.         android:layout_width="match_parent"  
  16.         android:id="@+id/autoCompleteTextView1">  
  17.     </AutoCompleteTextView>  
  18.     <Button android:text="搜索" android:id="@+id/button1"  
  19.         android:layout_width="wrap_content"  
  20.         android:layout_height="wrap_content"></Button>  
  21. </LinearLayout>  
           当之有一个edittext或者auto的时候,进入画面时是默认得到焦点的,要想去除焦点,可以在auto之前加一个o像素的layout,并设置他先得到焦点。

效果图如下


下面出现的是源码内容 

               需要注意的是,我这里用到的AutoCompleteTextView的几个方法
               1. setAdapter()方法:这里要传递的adapter参数必须是继承ListAdapter和Filterable的,其中arrayAdapter和simpleAdapter都能满足要求,我们常用arrayAdapter,因为他不需要像simpleAdapte那样设置他的显示位置和textview组件。
               要想掌握它,就必须查看他的源码,我们可以看看arrayadapter是如何实现
              凡是继承了Filterable的adapter都必须重写getFilter接口方法
[java]  view plain  copy
  1. public Filter getFilter() {  
  2.     if (mFilter == null) {  
  3.         mFilter = new ArrayFilter();  
  4.     }  
  5.     return mFilter;  
  6. }  
           这个filter 就是实现过滤方法的对象,同样,我们可以查看他的源码是如何实现的
           
[java]  view plain  copy
  1. /** 
  2.     * <p>An array filter constrains the content of the array adapter with 
  3.     * a prefix. Each item that does not start with the supplied prefix 
  4.     * is removed from the list.</p> 
  5.     */  
  6.    private class ArrayFilter extends Filter {  
  7.        @Override  
  8.        protected FilterResults performFiltering(CharSequence prefix) {  
  9.            FilterResults results = new FilterResults();  
  10.   
  11.            if (mOriginalValues == null) {  
  12.                synchronized (mLock) {  
  13.                    mOriginalValues = new ArrayList<T>(mObjects);  
  14.                }  
  15.            }  
  16.   
  17.            if (prefix == null || prefix.length() == 0) {  
  18.                synchronized (mLock) {  
  19.                    ArrayList<T> list = new ArrayList<T>(mOriginalValues);  
  20.                    results.values = list;  
  21.                    results.count = list.size();  
  22.                }  
  23.            } else {  
  24.                String prefixString = prefix.toString().toLowerCase();  
  25.   
  26.                final ArrayList<T> values = mOriginalValues;  
  27.                final int count = values.size();  
  28.   
  29.                final ArrayList<T> newValues = new ArrayList<T>(count);  
  30.   
  31.                for (int i = 0; i < count; i++) {  
  32.                    final T value = values.get(i);  
  33.                    final String valueText = value.toString().toLowerCase();  
  34.   
  35.                    // First match against the whole, non-splitted value  
  36.                    if (valueText.startsWith(prefixString)) {  
  37.                        newValues.add(value);  
  38.                    } else {  
  39.                        final String[] words = valueText.split(" ");  
  40.                        final int wordCount = words.length;  
  41.   
  42.                        for (int k = 0; k < wordCount; k++) {  
  43.                            if (words[k].startsWith(prefixString)) {  
  44.                                newValues.add(value);  
  45.                                break;  
  46.                            }  
  47.                        }  
  48.                    }  
  49.                }  
  50.   
  51.                results.values = newValues;  
  52.                results.count = newValues.size();  
  53.            }  
  54.   
  55.            return results;  
  56.        }  
           这是arrayAdapter自定义的一个私有内部类,所谓私有,就意味着你不能通过继承去修改这种过滤方法,同样你也不能直接得到他过滤后结果集results。假如你想使用新的过滤方法,你必须重写getfilter()方法,返回的filter对象是你要新建的filter对象(在里面包含performFiltering()方法重新构造你要的过滤方法)
          
         2.setDropDownHeight方法 ,用来设置提示下拉框的高度,注意,这只是限制了提示下拉框的高度,提示数据集的个数并没有变化
         3.setThreshold方法,设置从输入第几个字符起出现提示
         4.setCompletionHint方法,设置提示框最下面显示的文字
         5.setOnFocusChangeListener方法,里面包含OnFocusChangeListener监听器,设置焦点改变事件
         6.showdropdown方法,让下拉框弹出来
         

        我没有用到的一些方法列举
1.clearListSelection,去除selector样式,只是暂时的去除,当用户再输入时又重新出现
2.dismissDropDown,关闭下拉提示框
3.enoughToFilter,这是一个是否满足过滤条件的方法,sdk建议我们可以重写这个方法
4. getAdapter,得到一个可过滤的列表适配器
5.getDropDownAnchor,得到下拉框的锚计的view的id
6.getDropDownBackground,得到下拉框的背景色
7.setDropDownBackgroundDrawable,设置下拉框的背景色
8.setDropDownBackgroundResource,设置下拉框的背景资源
9.setDropDownVerticalOffset,设置下拉表垂直偏移量,即是list里包含的数据项数目
10.getDropDownVerticalOffset ,得到下拉表垂直偏移量
11..setDropDownHorizontalOffset,设置水平偏移量
12.setDropDownAnimationStyle,设置下拉框的弹出动画
13.getThreshold,得到过滤字符个数
14.setOnItemClickListener,设置下拉框点击事件
15.getListSelection,得到下拉框选中为位置
16.getOnItemClickListener。得到单项点击事件
17.getOnItemSelectedListener得到单项选中事件
18.getAdapter,得到那个设置的适配器

一些隐藏方法和构造我没有列举了,具体可以参考api文档 
可下载我的写的demo: http://download.youkuaiyun.com/detail/iamkila/4042528

转载我的文件请注明出处 http://blog.youkuaiyun.com/iamkila?viewmode=contents
Android学习:深入了解AutoCompleteTextView控件 总结一下,AutoCompleteTextView是一个强大且灵活的控件,可以为用户提供输入提示和自动完成的功能。通过设置数据集、适配器和监听器,我们可以完全控制AutoCompleteTextView的行为,并根据自己的需求进行定制。在本文中,我们将详细介绍AutoCompleteTextView的使用,并提供相应的源代码示例。AutoCompleteTextView的工作原理是根据用户输入的内容,在预定义的数据集中搜索匹配项,并显示在下拉列表中供用户选择。你可以根据自己的需求来定义具体的操作逻辑。 阅读详情

相关推荐

android使用AutoCompleteTextView自定义适配器样式

AutoCompleteTextView大多是采用ArrayAdapter进行适配的,这种有时候并不能满足我们的需求,所以就有了这个demo

文本类组件AutoCompleteTextView

介绍 在百度上面进行关键词搜索的时候,输入需要搜索的关键字就会显示一个下拉列表,列表中会匹配到用户输入的关键词汇,效果如图 5.1 所示。Android 也为开发者提供了一个这样的组件,那就是 AutoCompleteTextView 组件也叫做动完成文本框。AutoCompleteTextView 是 EditText 的子类,从外表上看它就是一个普通的编辑框组件,其实它内在的功能就是在用户输入一定的字符时,该组 件会显示一个下拉列表。在这个列表中用户单击需要的字符,该字符将自动填写在编辑框当中。

Black_Cat_33的博客 2275

ELK 企业级日志分析系统(1)

ELK平台是一套完整的日志集中处理解决方案,将、Logstash和Kiabana三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。ElasticSearch:是基于Lucene(一个全文检索引擎的架构)开发的分布式存储检索引擎,用来存储各类日志。Elasticsearch 是用 Java 开发的,可通过 RESTful Web 接口,让用户可以通过浏览器与 Elasticsearch 通信。

云计算运维工程师的成长之路 1864

28. 【Android教程】自动补全文本框 AutoCompleteText

本节继续学习采用 Adapter 实现的控件,如果你希望用户在输入文本的过程中能够得到文本补全建议,那么 AutoCompleteTextView 将是一个非常不错的选择。比如在搜索引擎的场景下就很适用,大家应该都有体会,在百度搜索框输入要搜索的关键词,如果需要等全部输入完毕敲回车才出结果,那将是一种很差的体验;而实际上百度是在我们输入的过程中实时的自动预判我们要输入的内容,然后帮我们补全关键词,这时候我们可以直接选择系统的补全方案而减少很多不必要的时间,大大提高了搜索效率,体验非常棒。

这是一个web全栈开发的博客,取其精华去其糟粕,争取让大家一看就懂,一学就会,一用就成~ 2243

基于ESP32-C3的便携式血氧仪硬件与算法实现

血氧饱和度(SpO₂)监测是生理参数无创检测的核心技术之一,其原理基于光电容积脉搏波(PPG)信号中红光与红外光吸收比值的动态变化。该技术依赖高精度模拟前端、稳定光学激励及实时数字信号处理能力,在消费级健康设备中面临功耗、体积与测量鲁棒性的多重约束。ESP32-C3凭借集成LEDC、12位ADC与低功耗双核架构,成为PPG终端的理想主控平台;结合定制化指夹式光学探头与比率法血氧算法,可实现非诊断级但趋势可靠的日常健康监测。本文围绕硬件电路设计、电源管理策略与嵌入式信号处理流程展开,覆盖从LED驱动、跨阻放大

weixin_29025501的博客 132

STDP实战:用PyTorch从零搭建脉冲神经网络(附完整代码)

本文提供了基于PyTorch从零搭建脉冲神经网络的实战教程,重点讲解了STDP学习规则的原理与工程实现。通过构建LIF神经元模型和向量化STDP层,并结合泊松编码,详细演示了如何构建一个能够进行无监督特征学习的混合网络架构,为探索神经形态计算和低功耗实时学习方案提供了完整代码与实践指南。

weixin_29056145的博客 265

Android AutoCompleteTextView使用

AutoCompleteTextView是一个android提供的可以补全输入的textview,效果类似于PC端百度一下那个输入框下面会带出来搜索历史。 先看下效果图: 我采用了自定义adapter的方式给他增加了删除的功能(单击x会删除那一条记录) 实现步骤: xml布局中添加AutoCompleteTextView <AutoCompleteTextView ...

孙先森的博客 8674

深入探索前端调试神器vConsole

vConsole作为一款前端调试神器,为前端开发者提供了一个便捷的调试解决方案。通过本文的介绍和示例,相信你已经对vConsole有了更深入的了解。然而,vConsole的功能远不止于此,它还有许多高级用法和技巧等待你去发掘。讨论:你在前端开发中是如何使用vConsole的?你有没有发现vConsole的一些隐藏功能或技巧?欢迎在评论区分享你的经验和见解!💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 8522

AutoCompleteTextView的使用举例

代码如下: AppMain.java package lxy.litsoft; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.o

HappyDelano的专栏 3340

PON架构(全光网络)

目前组网架构世界上有一种最快的速度又是光,以前传统以太网络规划满足不了现在的需求。有线网 无线网 全光网络方案场景 全光网络分类 以太全光网络 PON(Pas-sive-Optical Network 无源光网络) 再典型的中大型高校网络中 推荐万兆入室 千兆到桌面的带宽设计 一般三层 (终端-接入层-汇聚层-核心层-出口(安全设备)-互联网) 单校区核心设备 一般采用两台高性能的核心交换机 双机的方式采用的是 M-LAG 多校区之间核心交换机采用1

qq_56248592的博客 6269

ESD防护设计宝典(十):RE(辐射发射)超标问题排查与解决

RE测试是EMC认证的“头号杀手”。当屏幕上出现一根根超标频谱线时,如何快速定位元凶并有效整改?本讲将带你化身电磁侦探,完成一次完美的RE问题“缉凶”。

m0_56451176的博客 394

AutoCompleteTextView的使用及属性详解

AutoCompleteTextView的使用非常简单 1

小太阳的专栏 8530

杰理蓝牙SPP用户接口详细文档

本文档详细介绍了基于JL701n芯片的蓝牙SPP用户接口实现。主要内容包括:1) 文件结构分析,包含必要的头文件和调试配置;2) 核心数据结构,如全局变量和TWS功能ID定义;3) 五大功能模块实现:数据发送、状态管理、数据接收、TWS支持和初始化清理;4) API接口说明,包括公共接口函数和回调函数;5) 使用教程,涵盖基本流程和高级应用示例。该接口支持虚拟串口连接,实现蓝牙设备间数据传输,特别针对TWS场景进行了优化,提供连接状态管理、数据收发等功能。文档还包含错误处理、重试机制等实用建议,适合蓝牙SP

qq_42014563的博客 1179

AutoCompleteTextView使用

AutoCompleteTextView是一个可以完成自动提示填充内容的TextView,比TextView多的功能就是提示功能,效果如下: 输入aa后会提示aaa,这是提前设置的 main.xml内的AutoCompleteTextView定义 <AutoCompleteTextView android:id="@+id/autotext"android:lay...

165

【教程4>第1章>第12节】通过Verilog读取txt格式数据进行测试并将结果导入到matlab

我们在verilog的testbench中,调用txt文件,将上述正弦样本数据作为测试激励输入到verilog模块中。通过这个方法,可以将一些较为复杂的数据导入到verilog中,进行FPGA数据处理模块的开发。即通过w方式打开一个新的txt文件,然后将verilog的输出保存到XY1.txt文件中。这个部分是txt文件的路径,实际使用时,修改为您自己的路径,或者将txt文件放在和我一样的路径中。这个是数据长度,matlab产生的txt多少长度,这个参数就修改为多少长度。这个txt就是保存这段数据的文件。

FPGA/MATLAB学习教程/源码/项目合作开发 1378

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

AutoCompleteTextView的使用

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

人丑多读书 505

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android中如何使用AutoCompleteTextView

今天新学了一个AutoCompleteTextView高级控件,当初写Java实现Ajax自动补全的时候就感觉很好玩,今天使用AutoCompleteTextView后感觉更简单了,所以特意整理一下分享出来 实现思路: 第一步:在xml中用一个AutoCompleteTextView标签、competionThreshold是从第几个字开始 第二步:编辑相对应的java,获取控件AutoCo

BIHUA0918的博客 756

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

AutoCompleteTextView setOnItemSelectedListener 无效

Android源码库里面,这个类的 OnItemSelectedListener事件没有做处理! 所以在使用这个类时,OnItemClickListener有效果,而OnItemSelectedListener没有效果的! 解决方法:利用反射机制,进行设置; 代码如下: [java] view plaincopyprint? /

wawxf2008的专栏 3007

AutoCompleteTextView的使用方法

学习AutoCompleteTextView自动提示输入,总结使用方法如下: 1、在layout目录下创建main.xml布局文件,该布局文件主要用于声明一个AutoCompleteTextView; 2、layout目录下创建list_item.xml布局文件,该布局文件主要用于提示文本 3、创建MainActivity继承Activity,...

huang274272268的专栏 152

AutoCompleteTextView

1}AhtoCompleteTextView 1)

ymangu的专栏 740

AutoCompleteTextView使用 监听

AutoCompleteTextView使用 Aneditabletextviewthatshowscompletionsuggestionsautomaticallywhiletheuseristyping. 一个可编辑的文本视图,在用户输入时,显示建议文本。 在文本编辑框下,弹出一个下拉框的显示菜单,以供用户选择一个选项 若没有选择弹出的下拉提示框,...

dh7995的博客 409

Android基础控件AutoCompleteTextView的使用

1.简单介绍 AutoCompleteTextView有点像EditText和Spinner的组合。所以使用AutoCompleteTextView和使用Spinner差不多,用ArrayAdapter即可。如果对ArrayAdapter还不了解,可以参考Spinner的使用。 2.简单使用 item_dropdown.xml <?xml version="1.0" encoding...

‎‎‎‎‎不想吃泡面 479

AutoCompleteTextView使用方法

1、在layout目录下创建main.xml布局文件,该布局文件主要用于声明一个AutoCompleteTextView; 2、layout目录下创建list_item.xml布局文件,该布局文件主要用于提示文本 3、创建MainActivity继承Activity,如下: package com.autocompl...

heyang1245的博客 171

AutoCompleteTextView使用,搜索提示

AutoCompleteTextView可以简单的做出数据提示,就是只能是以该字符开头

Chailyn的博客 606
上一篇: Bitmap的两种方法
下一篇: Android少踩的坑
rongbinjava
博客等级 码龄11年 15粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值