对于我的应用程序,我需要在输入时添加一个建议功能,我使用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);
}
}
}