使用EditText對ListView進行過濾,並作拼音匹配
阿新 • • 發佈:2019-01-27
通過EditText中的輸入,實現ListView過濾,主要是讓adapter實現Filterable介面。可以參考SimpleAdapter的實現方式。
至於拼音過濾,在google code中有一個pinyin4android的開源專案,已經實現了對中文拼音的匹配。
效果圖:
定義一個UserAdapter,對user的name欄位進行過濾:
- public class UserAdapter extends BaseAdapter implements Filterable{
-
private List<User> users;
- public Context mContext;
- private LayoutInflater mInflater;
- private FilterDemo mFilter;
- private ArrayList<User> mDisplayData;
- //記錄索引
- private ArrayList<FilterIndex> mFilterIndexs;
-
public UserAdapter(Context context, List<
- {
- super();
- mContext = context;
- this.users = users;
- mDisplayData = (ArrayList<User>) users;
- mFilterIndexs = new ArrayList<FilterIndex>();
-
mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- }
- @Override
- public int getCount()
- {
- // TODO Auto-generated method stub
- return mDisplayData.size();
- }
- @Override
- public Object getItem(int position)
- {
- // TODO Auto-generated method stub
- return mDisplayData.get(position);
- }
- @Override
- public long getItemId(int position)
- {
- // TODO Auto-generated method stub
- return mDisplayData.get(position).getId();
- }
- @Override
- public View getView(final int position, View convertView, ViewGroup parent)
- {
- // TODO Auto-generated method stub
- if (convertView == null)
- convertView = mInflater.inflate(R.layout.item, null);
- ViewHolder holder = new ViewHolder();
- holder.name = (TextView) convertView.findViewById(R.id.name);
- holder.age = (TextView) convertView.findViewById(R.id.age);
- User user = mDisplayData.get(position);
- SpannableStringBuilder ss=new SpannableStringBuilder(user.getName());
- if(!mFilterIndexs.isEmpty())
- ss.setSpan(new ForegroundColorSpan(Color.RED),mFilterIndexs.get(position).getBegin(),mFilterIndexs.get(position).getEnd(),Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
- holder.name.setText(ss);
- holder.age.setText(user.getAge()+"");
- return convertView;
- }
- static class ViewHolder
- {
- TextView name;
- TextView age;
- }
- @Override
- public Filter getFilter()
- {
- // TODO Auto-generated method stub
- if (mFilter == null) {
- mFilter = new FilterDemo();
- }
- return mFilter;
- }
- private class FilterDemo extends Filter {
- @Override
- protected FilterResults performFiltering(CharSequence prefix) {
- FilterResults results = new FilterResults();
- ArrayList<String>mData = new ArrayList<String>();
- mFilterIndexs.clear();
- for(int i = 0; i <users.size(); i ++){
- String name = users.get(i).getName();
- mData.add(name);
- }
- if (prefix == null || prefix.length() == 0) {
- results.values = mData;
- results.count = mData.size();
- } else {
- String prefixString = prefix.toString();
- int count = mData.size();
- ArrayList<String>newValues = new ArrayList<String>(count);
- for (int j = 0; j <count; j++) {
- String s = mData.get(j);
- //
- String s1 = getPinYinHeadChar(s);
- if(s1.contains(prefixString))
- {
- getFilterIndex(s1,prefixString);
- newValues.add(s);
- }else
- if(s.contains(prefixString))
- {
- getFilterIndex(s,prefixString);
- newValues.add(s);
- }
- }
- results.values = newValues;
- results.count = newValues.size();
- }
- return results;
- }
- @SuppressWarnings("unchecked")
- @Override
- protected void publishResults(CharSequence constraint, FilterResults results) {
- mDisplayData = new ArrayList<User>(results.count);
- for(String username:(ArrayList<String>)results.values)
- {
- for(User userInfo:users)
- {
- if(userInfo.getName().equals(username)){
- mDisplayData.add(userInfo);