Android中AutoCompleteTextView完整示例(二)

MainActivity如下:

package cc.testautocompletetextview2;
import android.os.Bundle;
import android.app.Activity;
/**
 * Demo描述
 * 利用自定义AutoCompleteTextView完成邮箱自动补全功能
 *
 * 参考资料:
 * 1 http://blog.csdn.net/fx_sky/article/details/9326129
 * 2 http://blog.csdn.net/jwzhangjie/article/details/15771953
 * 3 http://my.eoe.cn/eoe_haozi/archive/519.html
 * 4 http://gundumw100.iteye.com/blog/1056728
 *   Thank you very much
 */
public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}

}

AutoCompleteTextViewSubClass如下:

package cc.testautocompletetextview2;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.graphics.Color;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AutoCompleteTextView;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;

public class AutoCompleteTextViewSubClass extends AutoCompleteTextView {
	//可补全的邮箱后缀
	private static final String[] emailSuffix = { "@qq.com","@gmail.com", "@sina.com","@sohu.com"};
	public AutoCompleteTextViewSubClass(Context context){
		super(context);
		init(context);
	}
	public AutoCompleteTextViewSubClass(Context context, AttributeSet attrs) {
		super(context, attrs);
		init(context);
	}

	private void init(Context context){
		final AutoCompleteTextViewAdatper adapter = new AutoCompleteTextViewAdatper(context);
		setAdapter(adapter);
		//设置阈值
		//等同于布局文件中的 android:completionThreshold="2"
		//setThreshold(2);
		addTextChangedListener(new TextWatcher() {
			@Override
			public void afterTextChanged(Editable editable) {
				String inputString = editable.toString();
				System.out.println("--->输入的内容 inputString="+inputString);
				adapter.mList.clear();
				if (inputString.length() > 0) {
					for (int i = 0; i < emailSuffix.length; ++i) {
						adapter.mList.add(inputString + emailSuffix[i]);
					}
				}
				adapter.notifyDataSetChanged();
				showDropDown();
			}

			@Override
			public void beforeTextChanged(CharSequence s, int start, int count,int after) {

			}
			@Override
			public void onTextChanged(CharSequence s, int start, int before,int count) {
			}
		});
	}

	//定义AutoCompleteTextView的Adapter继承自BaseAdapter且实现Filterable接口
	class AutoCompleteTextViewAdatper extends BaseAdapter implements Filterable {
		List<String> mList;
		private Context mContext;
		private FilterSubClass mFilter;

		public AutoCompleteTextViewAdatper(Context context) {
			mContext = context;
			mList = new ArrayList<String>();
		}

		@Override
		public int getCount() {
			return mList == null ? 0 : mList.size();
		}

		@Override
		public Object getItem(int position) {
			return mList == null ? null : mList.get(position);
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if (convertView == null) {
				TextView textView = new TextView(mContext);
				textView.setTextColor(Color.RED);
				textView.setTextSize(30);
				convertView = textView;
			}
			TextView textView = (TextView) convertView;
			textView.setText(mList.get(position));
			return textView;
		}

		@Override
		public Filter getFilter() {
			if (mFilter == null) {
				mFilter = new FilterSubClass();
			}
			return mFilter;
		}

		// 只有满足setThreshold(2)这个阈值时才会执行performFiltering()
		private class FilterSubClass extends Filter {
			@Override
			protected FilterResults performFiltering(CharSequence constraint) {
				System.out.println("--->过滤 constraint=" + constraint.toString());
				FilterResults results = new FilterResults();
				if (mList == null) {
					mList = new ArrayList<String>();
				}
				results.values = mList;
				results.count = mList.size();
				return results;
			}

			@Override
			protected void publishResults(CharSequence constraint,
					FilterResults results) {
				if (results.count > 0) {
					notifyDataSetChanged();
				} else {
					notifyDataSetInvalidated();
				}
			}
		}
	}
}

main.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="自定义AutoCompleteTextView使用示例"
        android:layout_centerHorizontal="true"/>

    <cc.testautocompletetextview2.AutoCompleteTextViewSubClass
        android:id="@+id/autoCompleteTextView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dip"
        android:completionHint="请选择:"
        android:dropDownVerticalOffset="2dip"
        android:dropDownHorizontalOffset="2dip"
        android:completionThreshold="2"
    />

</RelativeLayout>



时间: 2024-10-26 18:47:50

Android中AutoCompleteTextView完整示例(二)的相关文章

Android中AutoCompleteTextView完整示例(一)

MainActivity如下: package cc.testautocompletetextview; import cc.testautocompletetextview1.R; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.app.Activity; /** * Demo描述 * AutoComp

Android中AutoCompleteTextView与MultiAutoCompleteTextView的用法_Android

本文以实例列举了Android中AutoCompleteTextView与MultiAutoCompleteTextView的使用方法,具体使用方法如下: 首先看AutoCompleteTextView的使用: 支持基本的自动完成功能,适用在各种搜索功能中,并且可以根据自己的需求设置他的默认显示数据.两个控件都可以很灵活的预置匹配的那些数据,并且可以设置输入多少值时开始匹配等等功能.布局文件很简单,如下所示: <LinearLayout xmlns:android="http://sche

Android中google Zxing实现二维码与条形码扫描

Android中google Zxing实现二维码与条形码扫描 了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说要加上二维码扫描功能,然后自己的屁颠屁颠的去百度,google啥的,发现很多朋友都有介绍二维码扫描的功能,然后我就跟着人家的介绍自己搞起了二维码扫描功能,跟着人家的帖子,很快我的项目就加入了扫描二维码的功能,然后自己还很开心. 随着微信的到来,二维码越来越火

Android中AutoCompleteTextView与MultiAutoCompleteTextView的用法

本文以实例列举了Android中AutoCompleteTextView与MultiAutoCompleteTextView的使用方法,具体使用方法如下: 首先看AutoCompleteTextView的使用: 支持基本的自动完成功能,适用在各种搜索功能中,并且可以根据自己的需求设置他的默认显示数据. 两个控件都可以很灵活的预置匹配的那些数据,并且可以设置输入多少值时开始匹配等等功能. 布局文件很简单,如下所示: <LinearLayout xmlns:android="http://sc

Android 中 ThreadLocal使用示例

Android 中 ThreadLocal使用示例 概要: Demo描述: ThreadLocal使用示例. 关于ThreadLocal的官方文档描述 Implements a thread-local storage, that is, a variable for which each thread has its own value. All threads share the same ThreadLocal object, but each sees a different value

Android清理设备内存详细完整示例(二)

MainActivity如下: package cc.c; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.List; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.MemoryInfo;

android中AutoCompleteTextView的简单用法(实现搜索历史)_Android

网上有不少教程,那个提示框字符集都是事先写好的,例如用一个String[] 数组去包含了这些数据,但是,我们也可以吧用户输入的作为历史记录保存 下面先上我写的代码: import android.app.Activity; import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view

Android中BaseAdapter用法示例_Android

本文实例讲述了Android中BaseAdapter用法.分享给大家供大家参考,具体如下: 概述: BaseAdapter就Android应用程序中经常用到的基础数据适配器,它的主要用途是将一组数据传到像ListView.Spinner.Gallery及GridView等UI显示组件,它是继承自接口类Adapter BaseAdapter Java代码: public class RecentAdapter extends BaseAdapter { private class RecentVi

Android中使用ZXing生成二维码(支持添加Logo图案)

ZXing是谷歌的一个开源库,可以用来生成二维码.扫描二维码.本文所介绍的是第一部分. 首先上效果图: ZXing相关各种文件官方下载地址:https://github.com/zxing/zxing/releases 或者在这里下载(只有本项目所用的jar包,版本号:3.2.0):链接:http://pan.baidu.com/s/1pLqAR5x 1.生成二维码的工具类 /** * 二维码生成工具类 */ public class QRCodeUtil { /** * 生成二维码Bitmap