![](/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.