网上找到的都是同ArrayAdapter一起使用的,有时候需要自定义风格,咋办?follow me!



看上图,实现了清空输入框内容和删除Item功能。

其实使用AutoCompleteTextView就得实现过滤器Filterable,你得告诉它怎么过滤。由于ArrayAdapter已经
帮我们实现了Filterable接口,所以我们很容易忽略这个,以为AutoCompleteTextView用起来很简单。如果你使用的是
BaseAdapter呢?当然,事实上也不难,只要让它也实现Filterable接口就可以了。

下面是源码:

实现自定义的Adapter

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import qianlong.qlmobile.tablet.csco.R;
  4. import android.content.Context;
  5. import android.util.Log;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.view.View.OnClickListener;
  10. import android.widget.BaseAdapter;
  11. import android.widget.Filter;
  12. import android.widget.Filterable;
  13. import android.widget.ImageView;
  14. import android.widget.TextView;
  15. public class AutoCompleteAdapter extends BaseAdapter implements Filterable{
  16. private Context context;
  17. private ArrayFilter mFilter;
  18. private ArrayList<String> mOriginalValues;//所有的Item
  19. private List<String> mObjects;//过滤后的item
  20. private final Object mLock = new Object();
  21. private int maxMatch=10;//最多显示多少个选项,负数表示全部
  22. public AutoCompleteAdapter(Context context,ArrayList<String> mOriginalValues,int maxMatch){
  23. this.context=context;
  24. this.mOriginalValues=mOriginalValues;
  25. this.maxMatch=maxMatch;
  26. }
  27. @Override
  28. public Filter getFilter() {
  29. // TODO Auto-generated method stub
  30. if (mFilter == null) {
  31. mFilter = new ArrayFilter();
  32. }
  33. return mFilter;
  34. }
  35. private class ArrayFilter extends Filter {
  36. @Override
  37. protected FilterResults performFiltering(CharSequence prefix) {
  38. // TODO Auto-generated method stub
  39. FilterResults results = new FilterResults();
  40. //          if (mOriginalValues == null) {
  41. //                synchronized (mLock) {
  42. //                    mOriginalValues = new ArrayList<String>(mObjects);//
  43. //                }
  44. //            }
  45. if (prefix == null || prefix.length() == 0) {
  46. synchronized (mLock) {
  47. Log.i("tag", "mOriginalValues.size="+mOriginalValues.size());
  48. ArrayList<String> list = new ArrayList<String>(mOriginalValues);
  49. results.values = list;
  50. results.count = list.size();
  51. return results;
  52. }
  53. } else {
  54. String prefixString = prefix.toString().toLowerCase();
  55. final int count = mOriginalValues.size();
  56. final ArrayList<String> newValues = new ArrayList<String>(count);
  57. for (int i = 0; i < count; i++) {
  58. final String value = mOriginalValues.get(i);
  59. final String valueText = value.toLowerCase();
  60. //                    if(valueText.contains(prefixString)){//匹配所有
  61. //
  62. //                    }
  63. // First match against the whole, non-splitted value
  64. if (valueText.startsWith(prefixString)) {  //源码 ,匹配开头
  65. newValues.add(value);
  66. }
  67. //                    else {
  68. //                        final String[] words = valueText.split(" ");//分隔符匹配,效率低
  69. //                        final int wordCount = words.length;
  70. //
  71. //                        for (int k = 0; k < wordCount; k++) {
  72. //                            if (words[k].startsWith(prefixString)) {
  73. //                                newValues.add(value);
  74. //                                break;
  75. //                            }
  76. //                        }
  77. //                    }
  78. if(maxMatch>0){//有数量限制
  79. if(newValues.size()>maxMatch-1){//不要太多
  80. break;
  81. }
  82. }
  83. }
  84. results.values = newValues;
  85. results.count = newValues.size();
  86. }
  87. return results;
  88. }
  89. @Override
  90. protected void publishResults(CharSequence constraint,
  91. FilterResults results) {
  92. // TODO Auto-generated method stub
  93. mObjects = (List<String>) results.values;
  94. if (results.count > 0) {
  95. notifyDataSetChanged();
  96. } else {
  97. notifyDataSetInvalidated();
  98. }
  99. }
  100. }
  101. @Override
  102. public int getCount() {
  103. // TODO Auto-generated method stub
  104. return mObjects.size();
  105. }
  106. @Override
  107. public Object getItem(int position) {
  108. // TODO Auto-generated method stub
  109. //此方法有误,尽量不要使用
  110. return mObjects.get(position);
  111. }
  112. @Override
  113. public long getItemId(int position) {
  114. // TODO Auto-generated method stub
  115. return position;
  116. }
  117. @Override
  118. public View getView(final int position, View convertView, ViewGroup parent) {
  119. // TODO Auto-generated method stub
  120. ViewHolder holder = null;
  121. if(convertView==null){
  122. holder=new ViewHolder();
  123. LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  124. convertView=inflater.inflate(R.layout.simple_list_item_for_autocomplete, null);
  125. holder.tv=(TextView)convertView.findViewById(R.id.simple_item_0);
  126. holder.iv=(ImageView)convertView.findViewById(R.id.simple_item_1);
  127. convertView.setTag(holder);
  128. }else{
  129. holder = (ViewHolder) convertView.getTag();
  130. }
  131. holder.tv.setText(mObjects.get(position));
  132. holder.iv.setOnClickListener(new OnClickListener() {
  133. @Override
  134. public void onClick(View v) {
  135. // TODO Auto-generated method stub
  136. String obj=mObjects.remove(position);
  137. mOriginalValues.remove(obj);
  138. notifyDataSetChanged();
  139. }
  140. });
  141. return convertView;
  142. }
  143. class ViewHolder {
  144. TextView tv;
  145. ImageView iv;
  146. }
  147. public ArrayList<String> getAllItems(){
  148. return mOriginalValues;
  149. }
  150. }
  1. import android.content.Context;
  2. import android.util.AttributeSet;
  3. import android.view.View;
  4. import android.widget.AutoCompleteTextView;
  5. import android.widget.ImageView;
  6. import android.widget.RelativeLayout;
  7. import android.widget.ImageView.ScaleType;
  8. public class AdvancedAutoCompleteTextView extends RelativeLayout{
  9. private Context context;
  10. private AutoCompleteTextView tv;
  11. public AdvancedAutoCompleteTextView(Context context) {
  12. super(context);
  13. // TODO Auto-generated constructor stub
  14. this.context=context;
  15. }
  16. public AdvancedAutoCompleteTextView(Context context, AttributeSet attrs) {
  17. super(context, attrs);
  18. // TODO Auto-generated constructor stub
  19. this.context=context;
  20. }
  21. @Override
  22. protected void onFinishInflate() {
  23. super.onFinishInflate();
  24. initViews();
  25. }
  26. private void initViews() {
  27. RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
  28. tv=new AutoCompleteTextView(context);
  29. tv.setLayoutParams(params);
  30. tv.setPadding(10, 0, 40, 0);
  31. //      tv.setSingleLine(true);
  32. RelativeLayout.LayoutParams p=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
  33. p.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
  34. p.addRule(RelativeLayout.CENTER_VERTICAL);
  35. p.rightMargin=10;
  36. ImageView iv=new ImageView(context);
  37. iv.setLayoutParams(p);
  38. iv.setScaleType(ScaleType.FIT_CENTER);
  39. iv.setImageResource(R.drawable.delete);
  40. iv.setClickable(true);
  41. iv.setOnClickListener(new View.OnClickListener() {
  42. @Override
  43. public void onClick(View v) {
  44. // TODO Auto-generated method stub
  45. tv.setText("");
  46. }
  47. });
  48. this.addView(tv);
  49. this.addView(iv);
  50. }
  51. public void setAdapter(AutoCompleteAdapter adapter){
  52. tv.setAdapter(adapter);
  53. }
  54. public void setThreshold(int threshold){
  55. tv.setThreshold(threshold);
  56. }
  57. public AutoCompleteTextView getAutoCompleteTextView(){
  58. return tv;
  59. }
  60. }

simple_list_item_for_autocomplete.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:orientation="horizontal"
  6. android:paddingTop="5dip"
  7. android:paddingBottom="5dip"
  8. >
  9. <TextView android:id="@+id/simple_item_0"
  10. android:layout_width="fill_parent"
  11. android:layout_height="wrap_content"
  12. android:layout_weight="1"
  13. android:paddingLeft="5dip"
  14. android:textColor="@android:color/black"
  15. />
  16. <ImageView android:id="@+id/simple_item_1"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:scaleType="fitCenter"
  20. android:src="@drawable/delete"
  21. android:layout_centerVertical="true"
  22. android:layout_marginRight="5dip"
  23. />
  24. </LinearLayout>

使用,通常情况下都这样:

  1. private AdvancedAutoCompleteTextView tv;
  2. private AutoCompleteAdapter adapter;
  3. private ArrayList<String> mOriginalValues=new ArrayList<String>();
  4. @Override
  5. public void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.main);
  8. mOriginalValues.add("1234561");
  9. mOriginalValues.add("1234562");
  10. mOriginalValues.add("2234563");
  11. mOriginalValues.add("2234564");
  12. mOriginalValues.add("3234561111");
  13. mOriginalValues.add("32345622222");
  14. mOriginalValues.add("323456333333");
  15. mOriginalValues.add("3234564444");
  16. mOriginalValues.add("3234565555");
  17. mOriginalValues.add("32345666666");
  18. mOriginalValues.add("32345777777");
  19. tv = (AdvancedAutoCompleteTextView) findViewById(R.id.tv);
  20. tv.setThreshold(0);
  21. adapter = new AutoCompleteAdapter(this, mOriginalValues, 10);
  22. tv.setAdapter(adapter);
  23. }  

    这是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文档

<AutoCompleteTextView

                android:id="@+id/input_city_name" 


                android:layout_width="wrap_content"


                    android:layout_height="wrap_content"


                    android:hint="@string/city_select_hint"


                    android:gravity="center"


                    android:maxLength="5"


                    android:completionThreshold="1"


                    android:popupBackground="@color/stroke_green"


                    android:background="@drawable/edittext_shape"/>

里面的android:popupBackground就是设置下拉框的背景色。

 
android:completionHint 设置出现在下拉菜单中的提示标题
android:completionThreshold 设置用户至少输入多少个字符才会显示提示
android:dropDownHorizontalOffset 下拉菜单于文本框之间的水平偏移。默认与文本框左对齐
android:dropDownHeight 下拉菜单的高度
android:dropDownWidth 下拉菜单的宽度
android:singleLine

单行显示

android:dropDownVerticalOffset

垂直偏移量

用AutoCompleteTextView实现历史记录提示的更多相关文章

  1. Android用AutoCompleteTextView实现搜索历史记录提示

    简介 在我们平常上网的时候经常会用到谷歌或百度,在输入框中输入我们想要输入的信息就会出现其他与其相关的提示信息,非常方便.这种效果在 Android中是用AutoCompleteTextView实现的 ...

  2. AutoCompleteTextView,Spinner,消息提示

    package com.example.wang.testapp2; import android.app.Notification; import android.app.NotificationM ...

  3. AutoCompleteTextView实现搜索提示功能的实现

    AutoCompleteTextView和EditText组件类似,都可以输入文本.但AutoCompleteTextView组件可以和一个字符串数组或List对象绑定,当用户输入两个及以上字符时,系 ...

  4. Android开发(30)--AutoCompleteTextView和MultiAutoCompleteTextView自动提示输入内容

    首先大家都见过类似这种效果, AutoCompleteTextView是实现动态匹配输入的内容 下面就通过一个实例来说明AutoCompleteTextView,同样,AutoCompleteText ...

  5. AutoCompleteTextView的应用

    现在我们上网几乎都会用百度或者谷歌搜索信息,当我们在输入框里输入一两个字后,就会自动提示我们想要的信息,这种效果在Android 里是如何实现的呢? 事实上,Android 的AutoComplete ...

  6. AutoCompleteTextView输入汉字拼音首字母实现过滤提示(支持多音字,Filterable的使用)

    AutoCompleteTextView具有输入提示的功能,但是它的这种提示不适合对股票列表的过滤,如果你玩过股票软件,就会知道只要输入股票名称的首字母或股票代码就会出现符合匹配的股票,这种过滤怎么实 ...

  7. Android 自学之自动完成文本框 AutoCompleteTextView

    自动完成文本框(AutoCompleteTextView)从EditText派生而出,实际上他也是一个编辑框,但他比普通的编辑框多了一个功能:当用户输入一定字符后,自动完成文本框会显示一个下拉菜单,供 ...

  8. AutoCompleteTextView的使用

    AutoCompleteTextView的使用 一.简介 1.AutoCompleteTextView的作用 2.AutoCompleteTextView的类结构图 也就是拥有EditText的各种功 ...

  9. Android零基础入门第47节:自动完成文本框AutoCompleteTextView

    原文:Android零基础入门第47节:自动完成文本框AutoCompleteTextView 上一期学习的Spinner的使用,掌握的怎么样?本期一起来学习AutoCompleteTextView的 ...

随机推荐

  1. [ACM] 1007 -球球方格

    与兔子方格类似,不过一秒走一格: 输入 代码 #include<iostream> using namespace std; int main(void) { int test_count ...

  2. Android Design Principles

    Android Design Principles Enchant Me Delight me in surprising ways 用惊奇的方式取悦用户 漂亮的界面,仔细放置的动画,一个恰到时机的音 ...

  3. NSNotificationCenter应用总结

    通常我们在 iOS 中发生什么事件时该做什么是由 Delegate 实现的,例如 View 加载完后会触发 viewDidLoad.  Apple 还为我们提供了另一种通知响应方式,那就是 NSNot ...

  4. NSoperation用法详解及与GCD的比较

    NSInvocationOperation // 基于一个对象和selector来创建操作.如果你已经有现有的方法来执行需要的任务,就可以使用这个类 NSInvocationOperation * o ...

  5. IOS学习资源收集--开发UI控件相关

    收集的一些本人了解过的iOS开发UI控件相关的代码资源(本文持续补充更新) 内容大纲: 1.本人在github上也上传了我分装好的一些可重复利用的UI控件 2.计时相关的自定义UILabel控件 正文 ...

  6. Win8.1RTM英文版安装中文语言包的两种方法

    Windows 8.1和Windows Server 2012 R2 RTM出来了,下载了个英文版的安装上了,发现远景上有朋友提供中文语言包,以下提供两种语言包的安装方法: 一.使用lpksetup命 ...

  7. 安装docker后,VMware网络无法访问了,VMware重置网络设置

    1.vmware虚拟机处于关闭状态 2.vmware程序->edit(编辑)-->左下角 "Restore Default"恢复默认设置         [恢复]完成后 ...

  8. 编写Java应用程序。首先,定义一个Print类,它有一个方法void output(int x),如果x的值是1,在控制台打印出大写的英文字母表;如果x的值是2,在 控制台打印出小写的英文字母表。其次,再定义一个主类——TestClass,在主类 的main方法中创建Print类的对象,使用这个对象调用方法output ()来打印出大 小写英文字母表。

    package zuoye; public class print1 { String a="abcdefghigklmnopqrstuvwxyz"; String B=" ...

  9. oracle存储过程--导出数据库表的说明文档

    Oracle查询表的名字和comments select a.table_name,b.comments from user_tables a,ALL_TAB_COMMENTS b where a.t ...

  10. YUV420查表法高效、无失真的转换为RGB32格式

    YUV格式有两大类:planar和packed.planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V,这里所讲述的就是这中存储格式的:packed的YUV ...