android EditText与Filterable接口之模糊查询

对于模糊查询AutoCompleteTextView控件也是继承自EditText,并结合Filterable接口来实现模糊查询的效果

代码如下:

public class UserAdapter extends BaseAdapter implements Filterable {  private MyFilter myFilter;  private List<UserInfo> userInfos;  private Context context;  private ArrayList<UserInfo> mOriginalValues;  private final Object mLock = new Object();

 public UserAdapter(Context context, List<UserInfo> userInfos) {   this.context = context;   this.userInfos = userInfos;  }

 @Override  public int getCount() {   // TODO Auto-generated method stub   return userInfos.size();  }

 @Override  public Object getItem(int arg0) {   // TODO Auto-generated method stub   return userInfos.get(arg0);  }

 @Override  public long getItemId(int position) {   // TODO Auto-generated method stub   return position;  }

 @Override  public View getView(int position, View convertView, ViewGroup parent) {

  View view = convertView;

  ViewHolder holder;   if (view == null) {    view = LayoutInflater.from(context).inflate(      R.layout.adapter_mohusearch, null);    holder = new ViewHolder();    holder.tv_nick = (TextView) view      .findViewById(R.id.adapter_mohutext);    view.setTag(holder);   } else {    holder = (ViewHolder) view.getTag();   }

  holder.tv_nick.setText(userInfos.get(position).getUsername());

  return view;  }


 static class ViewHolder {

  TextView tv_nick;   TextView tv_mobile;  }

 @Override  public Filter getFilter() {   if (myFilter == null) {    myFilter = new MyFilter();   }   return myFilter;  }

 class MyFilter extends Filter {

  @Override   protected FilterResults performFiltering(CharSequence prefix) {    // 持有过滤操作完成之后的数据。该数据包括过滤操作之后的数据的值以及数量。 count:数量 values包含过滤操作之后的数据的值    FilterResults results = new FilterResults();

   if (mOriginalValues == null) {     synchronized (mLock) {      // 将list的用户 集合转换给这个原始数据的ArrayList      mOriginalValues = new ArrayList<UserInfo>(userInfos);     }    }    if (prefix == null || prefix.length() == 0) {     synchronized (mLock) {      ArrayList<UserInfo> list = new ArrayList<UserInfo>(        mOriginalValues);      results.values = list;      results.count = list.size();     }    } else {     // 做正式的筛选     String prefixString = prefix.toString().toLowerCase();

    // 声明一个临时的集合对象 将原始数据赋给这个临时变量     final ArrayList<UserInfo> values = mOriginalValues;

    final int count = values.size();

    // 新的集合对象     final ArrayList<UserInfo> newValues = new ArrayList<UserInfo>(       count);

    for (int i = 0; i < count; i++) {      // 如果姓名的前缀相符或者电话相符就添加到新的集合      final UserInfo value = (UserInfo) values.get(i);

     if (Helper.getPinYinHeadChar(value.getUsername())        .startsWith(prefixString)        || value.getUsername().startsWith(prefixString)) {

      newValues.add(value);      }     }     // 然后将这个新的集合数据赋给FilterResults对象     results.values = newValues;     results.count = newValues.size();    }

   return results;   }

  @SuppressWarnings("unchecked")   @Override   protected void publishResults(CharSequence constraint,     FilterResults results) {    // 重新将与适配器相关联的List重赋值一下    userInfos = (List<UserInfo>) results.values;    AppContext.mListMH=(List<UserInfo>) results.values;    if (results.count > 0) {     notifyDataSetChanged();    } else {     notifyDataSetInvalidated();    }   }

 }

 

这就是一个listview 的adapter与Filterable接口结合的实例来实现模糊查询的功能

 

在代码里调用的如下:

private TextWatcher watcher = new TextWatcher() {

  @Override   public void onTextChanged(CharSequence s, int start, int before,     int count) {    // TODO Auto-generated method stub    // mRoundLinear.setVisibility(View.GONE);    mAdapterMH.getFilter()      .filter(mRoundSearchEdit.getText().toString());   }

  @Override   public void beforeTextChanged(CharSequence s, int start, int count,     int after) {    // TODO Auto-generated method stub   }

  @Override   public void afterTextChanged(Editable s) {

   // TODO Auto-generated method stub

  }  };

 

 

 

posted on 2013-05-21 14:36  yujian_bcq  阅读(1761)  评论(0编辑  收藏  举报

导航