1. 程式人生 > >使用EditText對ListView進行過濾,並作拼音匹配

使用EditText對ListView進行過濾,並作拼音匹配

通過EditText中的輸入,實現ListView過濾,主要是讓adapter實現Filterable介面。可以參考SimpleAdapter的實現方式。

至於拼音過濾,在google code中有一個pinyin4android的開源專案,已經實現了對中文拼音的匹配。

效果圖:


定義一個UserAdapter,對user的name欄位進行過濾:

  1. public class UserAdapter extends BaseAdapter implements Filterable{  
  2.         private List<User> users;  
  3.         public Context mContext;  
  4.         private LayoutInflater mInflater;  
  5.         private FilterDemo mFilter;  
  6.         private ArrayList<User> mDisplayData;  
  7.         //記錄索引  
  8.         private ArrayList<FilterIndex> mFilterIndexs;  
  9.         public UserAdapter(Context context, List<
    User> users)  
  10.         {  
  11.             super();  
  12.             mContext = context;  
  13.             this.users = users;  
  14.             mDisplayData = (ArrayList<User>) users;  
  15.             mFilterIndexs = new ArrayList<FilterIndex>();  
  16.             mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  17.         }  
  18.         @Override  
  19.         public int getCount()  
  20.         {  
  21.             // TODO Auto-generated method stub  
  22.             return mDisplayData.size();  
  23.         }  
  24.         @Override  
  25.         public Object getItem(int position)  
  26.         {  
  27.             // TODO Auto-generated method stub  
  28.             return mDisplayData.get(position);  
  29.         }  
  30.         @Override  
  31.         public long getItemId(int position)  
  32.         {  
  33.             // TODO Auto-generated method stub  
  34.             return mDisplayData.get(position).getId();  
  35.         }  
  36.         @Override  
  37.         public View getView(final int position, View convertView, ViewGroup parent)  
  38.         {  
  39.             // TODO Auto-generated method stub  
  40.             if (convertView == null)  
  41.               convertView = mInflater.inflate(R.layout.item, null);  
  42.             ViewHolder holder = new ViewHolder();  
  43.             holder.name = (TextView) convertView.findViewById(R.id.name);   
  44.             holder.age = (TextView) convertView.findViewById(R.id.age);  
  45.             User user = mDisplayData.get(position);  
  46.             SpannableStringBuilder ss=new SpannableStringBuilder(user.getName());  
  47.             if(!mFilterIndexs.isEmpty())  
  48.               ss.setSpan(new ForegroundColorSpan(Color.RED),mFilterIndexs.get(position).getBegin(),mFilterIndexs.get(position).getEnd(),Spannable.SPAN_EXCLUSIVE_INCLUSIVE);  
  49.             holder.name.setText(ss);  
  50.             holder.age.setText(user.getAge()+"");  
  51.             return convertView;  
  52.         }  
  53.         static class ViewHolder  
  54.         {  
  55.             TextView name;  
  56.             TextView age;  
  57.         }  
  58.         @Override  
  59.         public Filter getFilter()  
  60.         {  
  61.             // TODO Auto-generated method stub  
  62.             if (mFilter == null) {  
  63.                 mFilter = new FilterDemo();  
  64.             }  
  65.             return mFilter;  
  66.         }  
  67.         private class FilterDemo extends Filter {  
  68.             @Override  
  69.             protected FilterResults performFiltering(CharSequence prefix) {  
  70.                 FilterResults results = new FilterResults();  
  71.                 ArrayList<String>mData = new ArrayList<String>();  
  72.                 mFilterIndexs.clear();  
  73.                 for(int i = 0; i <users.size(); i ++){  
  74.                         String name = users.get(i).getName();  
  75.                         mData.add(name);  
  76.                 }  
  77.                 if (prefix == null || prefix.length() == 0) {  
  78.                     results.values = mData;  
  79.                     results.count = mData.size();  
  80.                 } else {  
  81.                     String prefixString = prefix.toString();  
  82.                     int count = mData.size();  
  83.                     ArrayList<String>newValues = new ArrayList<String>(count);  
  84.                     for (int j = 0; j <count; j++) {  
  85.                          String s = mData.get(j);  
  86.                         //  
  87.                         String s1 = getPinYinHeadChar(s);  
  88.                         if(s1.contains(prefixString))  
  89.                         {  
  90.                              getFilterIndex(s1,prefixString);  
  91.                              newValues.add(s);  
  92.                          }else  
  93.                          if(s.contains(prefixString))  
  94.                         {  
  95.                              getFilterIndex(s,prefixString);  
  96.                              newValues.add(s);  
  97.                         }  
  98.                     }  
  99.                     results.values = newValues;  
  100.                     results.count = newValues.size();  
  101.                 }  
  102.                 return results;  
  103.             }  
  104.             @SuppressWarnings("unchecked")  
  105.             @Override  
  106.             protected void publishResults(CharSequence constraint, FilterResults results) {  
  107.                     mDisplayData = new ArrayList<User>(results.count);  
  108.                     for(String username:(ArrayList<String>)results.values)  
  109.                     {  
  110.                           for(User userInfo:users)  
  111.                           {  
  112.                               if(userInfo.getName().equals(username)){  
  113.                                   mDisplayData.add(userInfo);