![](/img/trans.png)
[英]AutoCompleteTextview with Recyclerview with custom filtering
[英]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" />
有兩種方法可行並且不需要您對適配器進行子類化:
onItemClickListener
中調用setText(text, false)
view.findViewById<MaterialAutoCompleteTextView>(R.id.sizes).onItemClickListener =
AdapterView.OnItemClickListener { _, _, position, _ ->
setText(adapter.getItem(position).toString(), false);
}
view.findViewById<MaterialAutoCompleteTextView>(R.id.sampler).filters = arrayOf()
希望這對某人有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.