由于AutoCompleteTextView.setThreShold至少为1,所以在为空时,不会进行匹配
所以我们只需要重写他的enoughToFilter 方法,让他返回true就可以了
1.继承AutoCompleteTextView,重写enoughToFilter返回true
public class InstantAutoComplete extends AutoCompleteTextView {
public InstantAutoComplete(Context context) {
super(context);
}
public InstantAutoComplete(Context context, AttributeSet attrs) {
super(context, attrs);
}
public InstantAutoComplete(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean enoughToFilter() {
return true;
}
}
2.在activity中设置他的触摸事件(OnTouchListener)调用showDropDown方法
为了避免他连续点击两次下拉列表不显示或者有匹配条件弹出的下拉框却显示成第一次无条件的内容
所以对他进行了区分
autoText.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (TextUtils.isEmpty(autoText.getText())) {
autoText.showDropDown();
} else {
// adapter.getFilter().filter(quanshang.getText());
adapter.notifyDataSetChanged();
}
return false;
}
});
再贴上一个过滤
private class MyFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (mOriginalValues == null) {
synchronized (mLock) {
mOriginalValues = new ArrayList<T>(mObjects);
}
}
int count = mOriginalValues.size();
ArrayList<T> values = new ArrayList<T>();
for (int i = 0; i < count; i++) {//判断是否包含了关键字
T value = mOriginalValues.get(i);
String valueText = value.toString();
if (null != valueText && null != constraint
&& valueText.contains(constraint)) {
values.add(value);//有关键字,就加入到列表中
}
}
results.values = values;
results.count = values.size();
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
mObjects = (List<T>) results.values;//需要显示在下拉框中的value
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
}
在Adapter中实现Filterable接口,实现getFilter方法,返回自己的过滤原则
@Override public Filter getFilter() {//得到每次过滤的list return new MyFilter(); }
参考: