我正在从一个webservice
中检索字符串列表,并希望将它们列在AutoCompleteTextField
上,而不管内置的AutoCompleteTextField
过滤器。
我该怎么做?有没有一种简单地禁用它的内部过滤方式(最好不需要子类化)的方法? 我已经将所有结果加载到一个ArrayAdapter
中,但是由于过滤器的原因,其中一些结果没有显示出来。
如果我方向错误,请指点正确的方向。
我正在从一个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)
。
将filter参数设置为false,这样可以在不激活过滤器的情况下设置文本。
我通过创建一个继承ArrayAdapter
类并覆盖其getFilter()
方法的定制适配器来解决了我的问题。这样做可以使列表不基于文本框中放置的任何文本进行过滤,并显示所有项目。
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
。请保留HTML标记。在寻找类似东西时发现了这个,但可能是在一个有点不寻常的设置中 - 使用 AutocompleteTextView
作为 Spinner(当您想要包装在 TextInputLayout
中的 Spinner 时很有用)。
我还使用 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()