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

相信大家一定在见过手机通讯录的一个情景就是使用在选人的时候输入文本框里的数据就能自动筛选。今天也受一网友邀请,所以还是整理了一下这块的知识点,现在与大家共享一下,有什么疑惑的可以与我交流。实现的效果如下图。


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

方法名

作用

protected FilterResults performFiltering(CharSequence prefix)

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

protectedvoidpublishResults(CharSequence constraint,

FilterResults results)

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

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

  1. publicclassUserAdapterextendsBaseAdapterimplementsFilterable{
  2. privateMyFiltermyFilter;
  3. privateList<UserInfo>userInfos;
  4. privateContextcontext;
  5. privateArrayList<UserInfo>mOriginalValues;
  6. privatefinalObjectmLock=newObject();
  7. publicUserAdapter(Contextcontext,List<UserInfo>userInfos){
  8. this.context=context;
  9. this.userInfos=userInfos;
  10. }
  11. @Override
  12. publicintgetCount(){
  13. //TODOAuto-generatedmethodstub
  14. returnuserInfos.size();
  15. }
  16. @Override
  17. publicObjectgetItem(intarg0){
  18. //TODOAuto-generatedmethodstub
  19. returnuserInfos.get(arg0);
  20. }
  21. @Override
  22. publiclonggetItemId(intposition){
  23. //TODOAuto-generatedmethodstub
  24. returnposition;
  25. }
  26. @Override
  27. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  28. Viewview=convertView;
  29. ViewHolderholder;
  30. if(view==null){
  31. view=LayoutInflater.from(context).inflate(R.layout.list_item,
  32. null);
  33. holder=newViewHolder();
  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. returnview;
  43. }
  44. staticclassViewHolder{
  45. TextViewtv_nick;
  46. TextViewtv_mobile;
  47. }
  48. @Override
  49. publicFiltergetFilter(){
  50. if(myFilter==null){
  51. myFilter=newMyFilter();
  52. }
  53. returnmyFilter;
  54. }
  55. classMyFilterextendsFilter{
  56. @Override
  57. protectedFilterResultsperformFiltering(CharSequenceprefix){
  58. //持有过滤操作完成之后的数据。该数据包括过滤操作之后的数据的值以及数量。count:数量values包含过滤操作之后的数据的值
  59. FilterResultsresults=newFilterResults();
  60. if(mOriginalValues==null){
  61. synchronized(mLock){
  62. //将list的用户集合转换给这个原始数据的ArrayList
  63. mOriginalValues=newArrayList<UserInfo>(userInfos);
  64. }
  65. }
  66. if(prefix==null||prefix.length()==0){
  67. synchronized(mLock){
  68. ArrayList<UserInfo>list=newArrayList<UserInfo>(
  69. mOriginalValues);
  70. results.values=list;
  71. results.count=list.size();
  72. }
  73. }else{
  74. //做正式的筛选
  75. StringprefixString=prefix.toString().toLowerCase();
  76. //声明一个临时的集合对象将原始数据赋给这个临时变量
  77. finalArrayList<UserInfo>values=mOriginalValues;
  78. finalintcount=values.size();
  79. //新的集合对象
  80. finalArrayList<UserInfo>newValues=newArrayList<UserInfo>(
  81. count);
  82. for(inti=0;i<count;i++){
  83. //如果姓名的前缀相符或者电话相符就添加到新的集合
  84. finalUserInfovalue=(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. returnresults;
  98. }
  99. @Override
  100. protectedvoidpublishResults(CharSequenceconstraint,
  101. FilterResultsresults){
  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(newTextWatcher(){
  2. @Override
  3. publicvoidonTextChanged(CharSequences,intstart,intbefore,
  4. intcount){
  5. adapter.getFilter().filter(et_filter.getText().toString());
  6. }
  7. @Override
  8. publicvoidbeforeTextChanged(CharSequences,intstart,intcount,
  9. intafter){
  10. //TODOAuto-generatedmethodstub
  11. }
  12. @Override
  13. publicvoidafterTextChanged(Editables){
  14. //TODOAuto-generatedmethodstub
  15. }
  16. });


好了这么一样的一个功能就如此简单的完成了,希望能对大家有所帮助了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值