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

其实实现这样的效果相信大家一定对另外一个控件不陌生那就AutoCompleteTextview,看一下这个控件的源代码也许就能找到你需要的
答案。这里的核心就是一个Filterable。至于Filterable的介绍和做什么用的大家就可以自行上网查找相关知识,其中有两个重要的方法

方法名

作用

protected FilterResults performFiltering(CharSequence prefix)

在这个方法里执行过滤方法

protected
void
publishResults(CharSequence constraint,

FilterResults results)

在这个方法里发布筛选过后得到的数据同时更新Adapter更新

理解这点知识那么就看核心代码吧,这里就是重写BaseAdapter然后实现Filterable

  1. public class UserAdapter extends BaseAdapter implements Filterable {
  2. private MyFilter myFilter;
  3. private List<UserInfo> userInfos;
  4. private Context context;
  5. private ArrayList<UserInfo> mOriginalValues;
  6. private final Object mLock = new Object();
  7. public UserAdapter(Context context, List<UserInfo> userInfos) {
  8. this.context = context;
  9. this.userInfos = userInfos;
  10. }
  11. @Override
  12. public int getCount() {
  13. // TODO Auto-generated method stub
  14. return userInfos.size();
  15. }
  16. @Override
  17. public Object getItem(int arg0) {
  18. // TODO Auto-generated method stub
  19. return userInfos.get(arg0);
  20. }
  21. @Override
  22. public long getItemId(int position) {
  23. // TODO Auto-generated method stub
  24. return position;
  25. }
  26. @Override
  27. public View getView(int position, View convertView, ViewGroup parent) {
  28. View view = convertView;
  29. ViewHolder holder;
  30. if (view == null) {
  31. view = LayoutInflater.from(context).inflate(R.layout.list_item,
  32. null);
  33. holder = new ViewHolder();
  34. holder.tv_nick = (TextView) view.findViewById(R.id.tv_nick);
  35. holder.tv_mobile = (TextView) view.findViewById(R.id.tv_mobile);
  36. view.setTag(holder);
  37. } else {
  38. holder = (ViewHolder) view.getTag();
  39. }
  40. holder.tv_nick.setText(userInfos.get(position).getUsername());
  41. holder.tv_mobile.setText(userInfos.get(position).getPhonenum());
  42. return view;
  43. }
  44. static class ViewHolder {
  45. TextView tv_nick;
  46. TextView tv_mobile;
  47. }
  48. @Override
  49. public Filter getFilter() {
  50. if (myFilter == null) {
  51. myFilter = new MyFilter();
  52. }
  53. return myFilter;
  54. }
  55. class MyFilter extends Filter {
  56. @Override
  57. protected FilterResults performFiltering(CharSequence prefix) {
  58. // 持有过滤操作完成之后的数据。该数据包括过滤操作之后的数据的值以及数量。 count:数量 values包含过滤操作之后的数据的值
  59. FilterResults results = new FilterResults();
  60. if (mOriginalValues == null) {
  61. synchronized (mLock) {
  62. // 将list的用户 集合转换给这个原始数据的ArrayList
  63. mOriginalValues = new ArrayList<UserInfo>(userInfos);
  64. }
  65. }
  66. if (prefix == null || prefix.length() == 0) {
  67. synchronized (mLock) {
  68. ArrayList<UserInfo> list = new ArrayList<UserInfo>(
  69. mOriginalValues);
  70. results.values = list;
  71. results.count = list.size();
  72. }
  73. } else {
  74. // 做正式的筛选
  75. String prefixString = prefix.toString().toLowerCase();
  76. // 声明一个临时的集合对象 将原始数据赋给这个临时变量
  77. final ArrayList<UserInfo> values = mOriginalValues;
  78. final int count = values.size();
  79. // 新的集合对象
  80. final ArrayList<UserInfo> newValues = new ArrayList<UserInfo>(
  81. count);
  82. for (int i = 0; i < count; i++) {
  83. // 如果姓名的前缀相符或者电话相符就添加到新的集合
  84. final UserInfo value = (UserInfo) values.get(i);
  85. Log.i("coder", "PinyinUtils.getAlpha(value.getUsername())"
  86. + PinyinUtils.getAlpha(value.getUsername()));
  87. if (PinyinUtils.getAlpha(value.getUsername()).startsWith(
  88. prefixString)
  89. || value.getPhonenum().startsWith(prefixString)||value.getUsername().startsWith(prefixString)) {
  90. newValues.add(value);
  91. }
  92. }
  93. // 然后将这个新的集合数据赋给FilterResults对象
  94. results.values = newValues;
  95. results.count = newValues.size();
  96. }
  97. return results;
  98. }
  99. @Override
  100. protected void publishResults(CharSequence constraint,
  101. FilterResults results) {
  102. // 重新将与适配器相关联的List重赋值一下
  103. userInfos = (List<UserInfo>) results.values;
  104. if (results.count > 0) {
  105. notifyDataSetChanged();
  106. } else {
  107. notifyDataSetInvalidated();
  108. }
  109. }
  110. }
  111. }

具体有看不懂的代码可以看注释或者加我QQ

最后再看一下是怎么用的吧

    1. et_filter.addTextChangedListener(new TextWatcher() {
    2. @Override
    3. public void onTextChanged(CharSequence s, int start, int before,
    4. int count) {
    5. adapter.getFilter().filter(et_filter.getText().toString());
    6. }
    7. @Override
    8. public void beforeTextChanged(CharSequence s, int start, int count,
    9. int after) {
    10. // TODO Auto-generated method stub
    11. }
    12. @Override
    13. public void afterTextChanged(Editable s) {
    14. // TODO Auto-generated method stub
    15. }
    16. });

Android实现Filterable通过输入文本框实现联系人自动筛选的更多相关文章

  1. jquery删除添加输入文本框

    效果体验:http://hovertree.com/texiao/jquery/67/ 效果图: 参考:http://hovertree.com/h/bjaf/traversing_each.htm ...

  2. iOS之自动调节输入文本框的高度

    //自动调节输入文本框的高度 - (void)textViewDidChange:(UITableView *)textView{ float height; if ([[[UIDevice curr ...

  3. 微信小程序-form表单-获取用户输入文本框的值

    微信小程序-form表单-获取用户输入文本框的值 <input name='formnickname' class="textarea" placeholder=" ...

  4. (转)完美解决 Android WebView 文本框获取焦点后自动放大有关问题

    完美解决 Android WebView 文本框获取焦点后自动放大问题 前几天在写一个项目时,要求在项目中嵌入一个WebView 本来很快就完成了,测试也没有问题.但发给新加坡时,他们测试都会出现文本 ...

  5. Android 利用Sharp样式设置文本框EditText圆角形状

    1.首先新建样式文件editsharp.xml: <?xml version="1.0" encoding="utf-8"?> <shape ...

  6. JS基础 浏览器弹出的三种提示框(提示信息框、确认框、输入文本框)

    浏览器的三种提示框 alert() //提示信息框 confirm() //提示确认框 prompt() //提示输入文本框 1.alert( ) 提示信息框 <script> alert ...

  7. JQ三种提示框:提示信息框、确认框、输入文本框

    浏览器的三种提示框: alert()提示信息框 confirm()提示确认框 prompt()提示输入文本框 1.alert()提示信息框 效果: 实现代码: <script> alert ...

  8. Android控件之EditText(输入文本框控件)

    一.EditText控件概述 EditText是一个非常重要的组件,可以说他是用户和Android应用进行数据传输窗口  有了他就等于有了一扇和Android应用传输的门,通过他用户可以把数据传输给A ...

  9. ASP.NET输入文本框自动提示功能

    在ASP.NET Web开发中会经常用到自动提示功能,比如百度搜索.我们只要输入相应的关键字,就可以自动得到相似搜索关键字的提示,方便我们快速的输入关键字进行查询. 那么在ASP.NET中,如果我们需 ...

随机推荐

  1. 数往知来C#之接口 值类型与引用类型 静态非静态 异常处理 GC垃圾回收 值类型引用类型内存分配<四>

    C# 基础接口篇 一.多态复习 使用个new来实现,使用virtual与override    -->new隐藏父类方法 根据当前类型,电泳对应的方法(成员)    -->override ...

  2. Hive QL

    转自http://www.alidata.org/archives/581 Hive 的官方文档中对查询语言有了很详细的描述,请参考:http://wiki.apache.org/hadoop/Hiv ...

  3. air开发中的requestedDisplayResolution 扫盲

    app.xml里面requestedDisplayResolution 取值可以为high/standard, 如果为high表示设备跟ios声明它需要使用高清屏(其实就是需要最大分辨率) 这里我猜测 ...

  4. incompatible

  5. samba服务设置,Linux系统和Windows文件共享

    samba是一个工具套件,在Unix上实现SMB(Server Message Block)协议,或者称之为NETBIOS/LanManager协议.SMB协议通常是被windows系列用来实现磁盘和 ...

  6. 第三百四十天 how can I 坚持

    感觉还是要制定个计划,做不做不到是一回事,但是得制定.目标,一年时间进小米,加油,fordream 计划好好想想,技不在多,精就好. 晚上写了写杨辉三角,都不记得什么是杨辉三角了. 人言落日是天涯,望 ...

  7. c++builder 重载WindowProc、WndProc 截获消息

    c++builder 重载WindowProc.WndProc 截获消息 方法一WindowProc void __fastcall  myWindowProc(Messages::TMessage ...

  8. 转】Spark DataFrame小试牛刀

    原博文出自于: https://segmentfault.com/a/1190000002614456 感谢! 三月中旬,Spark发布了最新的1.3.0版本,其中最重要的变化,便是DataFrame ...

  9. RFID第二次作业

    1.简述智能卡的发展,以及射频电子标签在其中所处的位置. 智能卡(Smart Card)又称为集成电路卡(IC卡),内部带有微处理器和存储单元等部件. 射频电子标签是一种非接触式的IC卡,是后期发展起 ...

  10. Linux下的grep搜索命令详解(二)

    grep与正规表达式  字符类 字符类的搜索:如果我想要搜寻 test 或 tast 这两个单词时,可以发现到,其实她们有共通的 't?st' 存在-这个时候,我可以这样来搜寻: [root@www ...