Android实现Filterable通过输入文本框实现联系人自动筛选

时间:2021-11-22 00:59:46

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

Android实现Filterable通过输入文本框实现联系人自动筛选

其实实现这样的效果相信大家一定对另外一个控件不陌生那就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. &lpar;转&rpar;完美解决 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&lpar;输入文本框控件&rpar;

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

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

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

随机推荐

  1. Ubuntu常用命令之update-alternatives

    maintain symbolic links determining default commands update-alternatives creates, removes, maintains ...

  2. linux增加自定义path和manpath

    linux安装软件到自定义路径时,新安装的命令需要带上路径才可以执行,不能像系统自带命令那样可以直接使用. 这个时候可以通过修改环境变量PATH和MANPATH,来实现像系统命令一样使用新安装的命令并 ...

  3. phonegap配置启动动画

    以下有2种方式 1 主Active中 onCreate函数里添加代码 2 config.xml文件进行配置(对通过命令行模式下cordova命令行生成的可行) 确保自己安装了SplashScreen插 ...

  4. HOWTO Use Python in the web — Python v3&period;0&period;1 documentation

    HOWTO Use Python in the web - Python v3.0.1 documentation mod_python¶ People coming from PHP often f ...

  5. FastJSON应用前测试

    FastJSON 应用前测试 FastJSON是一个很好的java开源json工具类库,相比其他同类的json类库,它的速度的确是fast,最快!但是文档做得不好,在应用前不得不亲测一些功能.\ 实际 ...

  6. 网页WEB打印控件

    网页WEB打印控件制作 在WEB系统中,打印的确是比较烦人的问题,如果我们能制作一个属于自己的自定义的打印插件,那么我们在后续自定义打印的时候能随心所欲的控制打印,这样的效果对于程序员来说是非常开心的 ...

  7. linux screen 工具

    一.背景 系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份.ftp 传输等等.通常情况下我们都是为每一个这样的任务开一个远 ...

  8. jquery 实现按回车键登录功能的写法

    <script> //登录的逻辑函数 自己写 function submitFuc(){ var loginName= $("#loginName").val(); v ...

  9. java&lowbar;线程

    线程1    与线程相关的概念    线程与进程的区别    线程创建策略    线程组        线程创建策略        并发应用中一般有两种不同的线程创建策略        1直接控制线程 ...

  10. Type Safety and Type Inference

    Swift is a type-safe language. A type safe language encourages you to be clear about the types of va ...