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中,如果我们需 ...
随机推荐
- NSIS学习笔记(转)
转自:http://blog.csdn.net/lee353086/article/details/45919901 NSIS学习笔记Date:2015-05-20Author:kagulaEnv:V ...
- CentOS下安装gns3
1.安装支持环境 sudo yum intall PyQt4 telnet 2.安装抓包用的wireshark sudo yum install wireshark wireshark-gnome 3 ...
- int型长度
Ø 基本数据类型 C语言中只有4中基本数据类型——整型.浮点型.指针和聚合类型(如数组和结构等):所有其他类型都是从这4种基本类型的某种变化或组合派生而来. 一.整型家族 整型家族包括char.sh ...
- Python 最佳实践
前言 对我来说,以前每次面试是我审视自己,检验自己的一种方式.每次准备面试,以及被面试官问住的时候才会发现,其实我python我学的还不够好.工作中也是,可以从其他的同事那里获得成长.但是我今天说的是 ...
- 记录一下JS正则的坑
JS正则的单行模式有点问题 总之 . 符号匹配换行符号会有问题 暂时的解决方案是 html = html.replace(/[\r\n]/g,""); 附加一个 html = ht ...
- Yarn中的几种状态机
1 概述 为了增大并发性,Yarn采用事件驱动的并发模型,将各种处理逻辑抽象成事件和调度器,将事件的处理过程用状态机表示.什么是状态机? 如果一个对象,其构成为若干个状态,以及触发这些状态发生相互转移 ...
- mysql基础知识(5)--视图
视图 单词:view 什么是视图: 视图可以看作是一个“临时存储的数据所构成的表”(非真实表),其实本质上只是一个select语句.只是将该select语句(通常比较复杂)进行一个“包装”,并设定了一 ...
- js闭包测试
本文的诞生,源自近期打算做的一个关于javascript中的闭包的专题,由于需要解析闭包对垃圾回收的影响,特此针对不同的javascript引擎,做了相关的测试. 为了能从本文中得到需要的知识,看本文 ...
- uestc oj 1217 The Battle of Chibi (dp + 离散化 + 树状数组)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1217 给你一个长为n的数组,问你有多少个长度严格为m的上升子序列. dp[i][j]表示以a[i]结尾长为j ...
- strlen与sizeof的区别 [转]
转自:http://www.cppblog.com/liangbo/archive/2006/10/06/13394.html 1.sizeof操作符的结果类型是size_t,它在头文件中typede ...