AutoCompeleteTextView無條件顯示下拉框列表(參考別人)

由於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();
}

參考:





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章