簡體   English   中英

AutoCompleteTextView - 禁用過濾

[英]AutoCompleteTextView - disable filtering

我正在從webservice服務中檢索字符串列表,並且我想將它們列在AutoCompleteTextField上,而不管內置的AutoCompleteTextField過濾器。

我怎么做? 有沒有辦法輕松禁用它的內部過濾(最好沒有子類化)我已經將所有結果加載到ArrayAdapter中,問題是其中一些由於過濾而沒有顯示。

如果我走錯了方向,請指出正確的方向。

可能 @Alon 意味着子類化ArrayAdapter ,而不是AutoCompleteTextView getFilter()方法中,必須返回一個自定義過濾器,它根本不執行任何過濾(在它的performFiltering() )。 性能可能是一個問題 - 因為產生了讀取。 最好的辦法是從 TextEdit 派生並實現自己的完成彈出窗口。 但到目前為止,這對我來說又太麻煩了。 最后,我做了以下事情,它對我有用。 任何反饋表示贊賞。

public class KArrayAdapter<T> 
extends ArrayAdapter<T>
{
    private Filter filter = new KNoFilter();
    public List<T> items;

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

    public KArrayAdapter(Context context, int textViewResourceId,
            List<T> objects) {
        super(context, textViewResourceId, objects);
        Log.v("Krzys", "Adapter created " + filter);
        items = objects;
    }

    private class KNoFilter extends Filter {

        @Override
        protected FilterResults performFiltering(CharSequence arg0) {
            FilterResults result = new FilterResults();
                result.values = items;
                result.count = items.size(); 
            return result;
        }

        @Override
        protected void publishResults(CharSequence arg0, FilterResults arg1) {
            notifyDataSetChanged();
        }
    }
}

希望能幫助到你。

將文本設置為 AutoCompleteTextView 時,請使用setText(CharSequence text, boolean filter) 將過濾器設置為 false,這會在不激活過濾器的情況下設置文本

我通過制作一個擴展ArrayAdapter類的自定義適配器並覆蓋其getFilter()方法來解決我的問題。 通過這樣做,列表將不會根據放置在 TextField 中的任何文本進行過濾,並且將顯示所有項目。

public class MyAdapter extends ArrayAdapter{
    public MyAdapter(@NonNull Context context, int resource) {
        super(context, resource);
    }

    public MyAdapter(@NonNull Context context, int resource, int textViewResourceId) {
        super(context, resource, textViewResourceId);
    }

    public MyAdapter(@NonNull Context context, int resource, @NonNull Object[] objects) {
        super(context, resource, objects);
    }

    public MyAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull Object[] objects) {
        super(context, resource, textViewResourceId, objects);
    }

    public MyAdapter(@NonNull Context context, int resource, @NonNull List objects) {
        super(context, resource, objects);
    }

    public MyAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull List objects) {
        super(context, resource, textViewResourceId, objects);
    }

    @NonNull
    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                return null;
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {

            }
        };
    }
}

最終我將ArrayAdapter子類化,通過覆蓋它的getFilter方法禁用過濾器,並在“文本更改”事件期間創建我的HTTPRequest

在尋找類似的東西時發現了這個,但是在可能有點不尋常的設置中 - 使用AutocompleteTextView作為微調器(當你想要一個包裹在TextInputLayout中的微調器時它很有用)。 我還使用app:simpleItems方法來提供項目而不是像這樣的自定義適配器:

<com.google.android.material.textfield.MaterialAutoCompleteTextView
                                android:id="@+id/sizes"
                                android:layout_width="match_parent"
                                android:layout_height="wrap_content"
                                android:inputType="none"
                                app:simpleItems="@array/sizes" />

有兩種方法可行並且不需要您對適配器進行子類化:

  1. onItemClickListener中調用setText(text, false)
view.findViewById<MaterialAutoCompleteTextView>(R.id.sizes).onItemClickListener =
        AdapterView.OnItemClickListener { _, _, position, _ ->
            setText(adapter.getItem(position).toString(), false);
        }
  1. 將空數組設置為過濾器。
view.findViewById<MaterialAutoCompleteTextView>(R.id.sampler).filters = arrayOf()

希望這對某人有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM