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中,如果我们需 ...
随机推荐
- nagios高可用性设置
1. 前言 如何来实现nagios监控系统的高可用,监控是很重要的,在关键时刻进行通知报警,通知人员进行相应的处理. 在进行配置的时候,需要配置两台相同服务的nagios服务器,配置相同,同时在运行, ...
- C++ 容器一些细节
今天学习是看到了讲解C++容器的一些细节用法,故记之!参考:http://www.cnblogs.com/answeryi/archive/2011/12/16/2289811.html: 目录 == ...
- android读取data下得数据
拥有Root权限的情况 adb shell su cd /data/data/com.package 然后就可以直接读取 没有Root的情况 adb shell run-as com.package ...
- Linux系统安装配置NTP时间服务器
背景 局域网不能上外网情况下同步集群时间,搭建NTP服务器,并设置其他主机每小时同步时间(假设使用地址为192.168.3.21的主机作为NTP服务器) 安装NTP $ sudo yum instal ...
- IDEA使用docker进行调试
背景 手头有个任务,需要用java通过jni调用一个开源算法库gmssl的功能,但是gmssl只提供了源码,需要编译后才能使用.按照通常的做法,我们会部署好centos的虚拟机和开发环境,安装好gms ...
- deque 居然已经实现了 insert 接口
最近有个开发需求,根据server传递来的广告位来展示某条广告. 但最终存储广告的数据结构是deque,里面存储的东西还是对象(stl 基于拷贝语义). 想了半天,在开头和结尾插入比较方便,在中间插入 ...
- Terrain & Light & Camera
[Terrain Engine] 1.When you press F, wherever your mouse is positioned will be moved to the center o ...
- CodeForces 711B Chris and Magic Square (暴力,水题)
题意:给定n*n个矩阵,其中只有一个格子是0,让你填上一个数,使得所有的行列的对角线的和都相等. 析:首先n为1,就随便填,然后就是除了0这一行或者这一列,那么一定有其他的行列是完整的,所以,先把其他 ...
- HDU 4496 D-City (并查集)
题意:给定一个图,问你每次删除一条边后有几个连通块. 析:水题,就是并查集的运用,倒着推. 代码如下: #include <cstdio> #include <string> ...
- WSARecv()
简述:从一个套接口接收数据. #include <winsock2.h> int WSAAPI WSARecv ( SOCKET s, LPWSABUF lpBuffers, DWORD ...