美文网首页
AutoCompleteTextView之自定义匹配模式

AutoCompleteTextView之自定义匹配模式

作者: 小言聊编程 | 来源:发表于2018-07-30 15:31 被阅读0次

AutoCompleteTextView默认的自动提示匹配规则,有时候无法满足业务需求,如若要改变它的匹配规则,就需要自定义adapter,并且要实现Filterable
实例部分代码如下:

   private Context mContext;
   private List<String> mItems;
   private List<String> fData;
   private final Object mLock = new Object();
   private MyFilter mFilter;

   public FilterAdapter(Context context) {
       this.mContext = context;
       mFilter = new MyFilter();
   }

   public void transforData(List<String> items) {
       this.mItems = items;
       notifyDataSetChanged();
   }


   @Override
   public int getCount() {
       return mItems.size();
   }

   @Override
   public String getItem(int position) {
       return mItems.get(position);
   }

   @Override
   public long getItemId(int position) {
       return position;
   }

   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
       ViewHolder viewHolder;
       if (convertView == null) {
           viewHolder = new ViewHolder();
           convertView = LayoutInflater.from(mContext).inflate(R.layout.item_auto_text, null);
           viewHolder.content = convertView.findViewById(R.id.tv_content);
           convertView.setTag(viewHolder);
       } else {
           viewHolder = (ViewHolder) convertView.getTag();
       }
       viewHolder.content.setText(mItems.get(position));
       return convertView;
   }

   class ViewHolder {
       TextView content;
   }

   @Override
   public Filter getFilter() {
       return mFilter;
   }

   private class MyFilter extends Filter {
       protected FilterResults performFiltering(CharSequence constraint) {
           FilterResults results = new FilterResults();
           if (fData == null) {
               synchronized (mLock) {
                   fData = new ArrayList<>(mItems);
               }
           }
           int count = fData.size();
           ArrayList<String> values = new ArrayList<>();
           for (int i = 0; i < count; i++) {
               String value = fData.get(i);
               if (null != value && null != constraint
                       && value.toLowerCase().contains(constraint.toString().toLowerCase())) {
                   values.add(value);
               }
           }
           results.values = values;
           results.count = values.size();
           return results;
       }
       @Override
       protected void publishResults(CharSequence arg0, FilterResults results) {
           mItems = (List<String>) results.values;
           if (results.count > 0) {
               notifyDataSetChanged();
           } else {
               notifyDataSetInvalidated();
           }
       }
   }
}

相关文章

网友评论

      本文标题:AutoCompleteTextView之自定义匹配模式

      本文链接:https://www.haomeiwen.com/subject/vbsfvftx.html