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


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

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

     

      1. et_filter.addTextChangedListener(new TextWatcher() {  
      2.   
      3.             @Override  
      4.             public void onTextChanged(CharSequence s, int start, int before,  
      5.                     int count) {  
      6.                 adapter.getFilter().filter(et_filter.getText().toString());  
      7.   
      8.             }  
      9.   
      10.             @Override  
      11.             public void beforeTextChanged(CharSequence s, int start, int count,  
      12.                     int after) {  
      13.                 // TODO Auto-generated method stub  
      14.   
      15.             }  
      16.   
      17.             @Override  
      18.             public void afterTextChanged(Editable s) {  
      19.                 // TODO Auto-generated method stub  
      20.   
      21.             }  
      22.         }); 
  • 相关阅读:
    [转]C#程序无法在64位系统上运行之.NET编译的目标平台
    STM32是否可以跑linux
    [转]C/C++ 实现文件透明加解密
    逻辑运算
    STM32F1和STM32F4 区别
    【转】STM32定时器输出比较模式中的疑惑
    Linux rabbitmq的安装和安装amqp的php插件
    跨境电商常用的物流方式
    linux 木马清理过程
    minerd
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/3498583.html
Copyright © 2011-2022 走看看