Android实现Filterable通过输入文本框实现联系人自动筛选
相信大家一定在见过手机通讯录的一个情景就是使用在选人的时候输入文本框里的数据就能自动筛选。实现的效果如下图。

其实实现这样的效果相信大家一定对另外一个控件不陌生那就AutoCompleteTextview,看一下这个控件的源代码也许就能找到你需要的
答案。这里的核心就是一个Filterable。至于Filterable的介绍和做什么用的大家就可以自行上网查找相关知识,其中有两个重要的方法
|
方法名 |
作用 |
|
protected FilterResults performFiltering(CharSequence prefix) |
在这个方法里执行过滤方法 |
|
protected FilterResults results) |
在这个方法里发布筛选过后得到的数据同时更新Adapter更新 |
理解这点知识那么就看核心代码吧,这里就是重写BaseAdapter然后实现Filterable
- public class UserAdapter extends BaseAdapter implements Filterable {
- private MyFilter myFilter;
- private List<UserInfo> userInfos;
- private Context context;
- private ArrayList<UserInfo> mOriginalValues;
- private final Object mLock = new Object();
- public UserAdapter(Context context, List<UserInfo> userInfos) {
- this.context = context;
- this.userInfos = userInfos;
- }
- @Override
- public int getCount() {
- // TODO Auto-generated method stub
- return userInfos.size();
- }
- @Override
- public Object getItem(int arg0) {
- // TODO Auto-generated method stub
- return userInfos.get(arg0);
- }
- @Override
- public long getItemId(int position) {
- // TODO Auto-generated method stub
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- View view = convertView;
- ViewHolder holder;
- if (view == null) {
- view = LayoutInflater.from(context).inflate(R.layout.list_item,
- null);
- holder = new ViewHolder();
- holder.tv_nick = (TextView) view.findViewById(R.id.tv_nick);
- holder.tv_mobile = (TextView) view.findViewById(R.id.tv_mobile);
- view.setTag(holder);
- } else {
- holder = (ViewHolder) view.getTag();
- }
- holder.tv_nick.setText(userInfos.get(position).getUsername());
- holder.tv_mobile.setText(userInfos.get(position).getPhonenum());
- return view;
- }
- static class ViewHolder {
- TextView tv_nick;
- TextView tv_mobile;
- }
- @Override
- public Filter getFilter() {
- if (myFilter == null) {
- myFilter = new MyFilter();
- }
- return myFilter;
- }
- class MyFilter extends Filter {
- @Override
- protected FilterResults performFiltering(CharSequence prefix) {
- // 持有过滤操作完成之后的数据。该数据包括过滤操作之后的数据的值以及数量。 count:数量 values包含过滤操作之后的数据的值
- FilterResults results = new FilterResults();
- if (mOriginalValues == null) {
- synchronized (mLock) {
- // 将list的用户 集合转换给这个原始数据的ArrayList
- mOriginalValues = new ArrayList<UserInfo>(userInfos);
- }
- }
- if (prefix == null || prefix.length() == 0) {
- synchronized (mLock) {
- ArrayList<UserInfo> list = new ArrayList<UserInfo>(
- mOriginalValues);
- results.values = list;
- results.count = list.size();
- }
- } else {
- // 做正式的筛选
- String prefixString = prefix.toString().toLowerCase();
- // 声明一个临时的集合对象 将原始数据赋给这个临时变量
- final ArrayList<UserInfo> values = mOriginalValues;
- final int count = values.size();
- // 新的集合对象
- final ArrayList<UserInfo> newValues = new ArrayList<UserInfo>(
- count);
- for (int i = 0; i < count; i++) {
- // 如果姓名的前缀相符或者电话相符就添加到新的集合
- final UserInfo value = (UserInfo) values.get(i);
- Log.i("coder", "PinyinUtils.getAlpha(value.getUsername())"
- + PinyinUtils.getAlpha(value.getUsername()));
- if (PinyinUtils.getAlpha(value.getUsername()).startsWith(
- prefixString)
- || value.getPhonenum().startsWith(prefixString)||value.getUsername().startsWith(prefixString)) {
- newValues.add(value);
- }
- }
- // 然后将这个新的集合数据赋给FilterResults对象
- results.values = newValues;
- results.count = newValues.size();
- }
- return results;
- }
- @Override
- protected void publishResults(CharSequence constraint,
- FilterResults results) {
- // 重新将与适配器相关联的List重赋值一下
- userInfos = (List<UserInfo>) results.values;
- if (results.count > 0) {
- notifyDataSetChanged();
- } else {
- notifyDataSetInvalidated();
- }
- }
- }
- }
具体有看不懂的代码可以看注释或者加我QQ
最后再看一下是怎么用的吧
- et_filter.addTextChangedListener(new TextWatcher() {
- @Override
- public void onTextChanged(CharSequence s, int start, int before,
- int count) {
- adapter.getFilter().filter(et_filter.getText().toString());
- }
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count,
- int after) {
- // TODO Auto-generated method stub
- }
- @Override
- public void afterTextChanged(Editable s) {
- // TODO Auto-generated method stub
- }
- });
Android实现Filterable通过输入文本框实现联系人自动筛选的更多相关文章
- jquery删除添加输入文本框
效果体验:http://hovertree.com/texiao/jquery/67/ 效果图: 参考:http://hovertree.com/h/bjaf/traversing_each.htm ...
- iOS之自动调节输入文本框的高度
//自动调节输入文本框的高度 - (void)textViewDidChange:(UITableView *)textView{ float height; if ([[[UIDevice curr ...
- 微信小程序-form表单-获取用户输入文本框的值
微信小程序-form表单-获取用户输入文本框的值 <input name='formnickname' class="textarea" placeholder=" ...
- (转)完美解决 Android WebView 文本框获取焦点后自动放大有关问题
完美解决 Android WebView 文本框获取焦点后自动放大问题 前几天在写一个项目时,要求在项目中嵌入一个WebView 本来很快就完成了,测试也没有问题.但发给新加坡时,他们测试都会出现文本 ...
- Android 利用Sharp样式设置文本框EditText圆角形状
1.首先新建样式文件editsharp.xml: <?xml version="1.0" encoding="utf-8"?> <shape ...
- JS基础 浏览器弹出的三种提示框(提示信息框、确认框、输入文本框)
浏览器的三种提示框 alert() //提示信息框 confirm() //提示确认框 prompt() //提示输入文本框 1.alert( ) 提示信息框 <script> alert ...
- JQ三种提示框:提示信息框、确认框、输入文本框
浏览器的三种提示框: alert()提示信息框 confirm()提示确认框 prompt()提示输入文本框 1.alert()提示信息框 效果: 实现代码: <script> alert ...
- Android控件之EditText(输入文本框控件)
一.EditText控件概述 EditText是一个非常重要的组件,可以说他是用户和Android应用进行数据传输窗口 有了他就等于有了一扇和Android应用传输的门,通过他用户可以把数据传输给A ...
- ASP.NET输入文本框自动提示功能
在ASP.NET Web开发中会经常用到自动提示功能,比如百度搜索.我们只要输入相应的关键字,就可以自动得到相似搜索关键字的提示,方便我们快速的输入关键字进行查询. 那么在ASP.NET中,如果我们需 ...
随机推荐
- 说说Python 中的文件操作 和 目录操作
我们知道,文件名.目录名和链接名都是用一个字符串作为其标识符的,但是给我们一个标识符,我们该如何确定它所指的到底是常规文件文件名.目录名还是链接名呢?这时,我们可以使用os.path模块提供的isfi ...
- 一款APP从设计稿到切图过程全方位揭秘 Mark
纯干货!一款APP从设计稿到切图过程全方位揭秘 @BAT_LCK:我本身是一名GUI设计师,所以我只站在GUI设计师的角度去把APP从项目启动到切片输出的过程写一写,相当于工作流程的介绍吧.公司不 ...
- 千万别把js的正则表达式方法和字符串方法搞混淆了
我们在字符串操作过程中肯定经常用了test() split() replace() match() indexof()等方法,很多人经常把用法写错了,包括我,所以今天细细的整理了下. test()是判 ...
- 基于MapReduce的矩阵乘法运算
1.采用两个MapReduce运算串联来实现 Pik= Mij*Njk 第一步: Map函数:将每个矩阵运算mij传给键值对(j,(M,i,mij)),将每个矩阵元素njk传给键值对(j,(N,k,n ...
- 指令式Callback,函数式Promise:对node.js的一声叹息
原文:Callbacks are imperative, promises are functional: Node's biggest missed opportunity promises 天生就 ...
- C#读取文件为byte数组
private byte[] FileContent(string fileName) { using (FileStream fs = new FileStream(fileName, FileMo ...
- (转载)ETL利器Kettle实战应用解析系列一【Kettle使用介绍】
http://www.cnblogs.com/limengqiang/archive/2013/01/16/kettleapply1.html ETL利器Kettle实战应用解析系列一[Kettle使 ...
- 技术文集:万能WINDOWS XP封装
这里将系统封装分为3步:做系统.封装.部署 一.做系统 平台不限,但不建议在虚拟机上制作.CPU及主板芯片没有限制,关于intelide和intelppm的不兼容问题,深度白金3in1并没有删除这些注 ...
- 个人用户安装SEP注意事项
一.安装时选择“非管控客户端” 二.安装时选择“自定义安装” 三.不要安装“应用程序与设备控制”,否则会拖慢开机 离线病毒库下载地址 http://www.symantec.com/securit ...
- linux下find查找命令用法
Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时 ...