Android上editText的自动建议



对于我的应用程序,我需要在输入时添加一个建议功能,我使用AppCompatAutoCompleteTextView,它工作得很好,但我在3件事上挣扎:

当用户键入时,是否建议中没有匹配项,我希望建议默认文本。例如,你输入jkdjfdkl,它会自动显示Other

<string-array name="feedback_topic_array">
<item>App Features</item>
<item>App Experience</item>
<item>Other</item>
</string-array>

另一点是,当用户点击App时,它会建议第2个项目,这很好,但我希望能够在建议的项目中设置App这个词。

我已经实现了下面的代码:

binding.topicEt.apply {
threshold = 0
val suggestAdapter = ArrayAdapter(context, android.R.layout.simple_dropdown_item_1line, resources.getStringArray(R.array.feedback_topic_array) )
setAdapter(suggestAdapter)
showDropDown()
//  performCompletion()
}

但是当没有匹配

时它不会设置默认值你知道吗?

使用listener

注意:至少设置阈值= 1

binding.topicEt.validator = object: AutoCompleteTextView.Validator {
override fun isValid(p0: CharSequence?): Boolean {
//returns true or false based on if the text is validated
return p0 == "COMPARE TEXT VALID";
}
override fun fixText(p0: CharSequence?): CharSequence{
// isValid() returns false then the code comes here
return "WHAT YOU WANT"
}
}

这可以通过自定义适配器完成。

SimpleContainsAutocompleteAdapter autocompleteAdapter = new SimpleContainsAutocompleteAdapter(this,list);
autoCompleteTextView.setAdapter(autocompleteAdapter);
autoCompleteTextView.setThreshold(1);

如果你在publishResults()中发现0个结果,你可以添加你的自定义建议,或者你可以说默认建议。

自定义适配器类

class SimpleContainsAutocompleteAdapter<T> extends ArrayAdapter<T> implements Filterable {
private List<T> listObjects;
List<T> suggestions = new ArrayList<>();
private int resource;
private Filter mFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
if (constraint != null) {
suggestions.clear();
for (T object : listObjects) {
if (object.toString().toLowerCase().contains(constraint.toString().toLowerCase())) {
suggestions.add(object);
}
}
filterResults.values = suggestions;
filterResults.count = suggestions.size();
}
return filterResults;
}
@Override
protected void publishResults(CharSequence contraint, FilterResults results) {
if (results == null) {
return;
}
List<T> filteredList = (List<T>) results.values;
if(filteredList==null)
{
clear();
notifyDataSetChanged();
return;
}
if (results.count > 0) {
clear();
for (T filteredObject : filteredList) {
add(filteredObject);
}
notifyDataSetChanged();
} else {
clear();
filteredList.add(0, (T) "Default");
for (T filteredObject : filteredList) {
add(filteredObject);
}
notifyDataSetChanged();
}
}
};
public SimpleContainsAutocompleteAdapter(Context context, List<T> listObjects) {
super(context, android.R.layout.simple_list_item_1, listObjects);
this.listObjects = new ArrayList<>(listObjects);
this.resource =  android.R.layout.simple_list_item_1;
}
@Override
public Filter getFilter() {
return mFilter;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Object listObject = getItem(position);
ViewHolder holder;
if (convertView != null) {
holder = (ViewHolder) convertView.getTag();
} else {
convertView = LayoutInflater.from(getContext()).inflate(resource, parent, false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}
holder.name.setText(listObject.toString());
return convertView;
}

class ViewHolder {
TextView name;
public ViewHolder(View view) {
name = view.findViewById(android.R.id.text1);
}
}
}

最新更新