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();
}
}
}
}
网友评论