我已经为AutoCompleteTextView创建了自定义适配器。
package ...
import ...
public class CardSuggestionAdapter extends ArrayAdapter<String> implements Filterable {
private final LayoutInflater mInflater;
private Activity context;
private int mFieldId, mResource;
CardSuggestionAdapter(Activity context, String[] names) {
super(context, R.layout.card_suggestion, R.id.name_label, names);
this.context = context;
this.mFieldId = R.id.name_label;
this.mResource = R.layout.card_suggestion;
this.mInflater = LayoutInflater.from(context);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
return createViewFromResource(mInflater, position, convertView, parent, mResource);
}
@NonNull
@Override
public Filter getFilter() {
return new CardsFilter();
}
private View createViewFromResource(@NonNull LayoutInflater inflater, int position, @Nullable
View convertView, @NonNull ViewGroup parent, int resource) {
View view = convertView;
final TextView text;
ViewHolder viewHolder;
if (convertView == null) {
view = inflater.inflate(resource, parent, false);
viewHolder = new ViewHolder(view);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
text = view.findViewById(mFieldId);
if (text == null) {
throw new RuntimeException("Failed to find view with ID "
+ context.getResources().getResourceName(mFieldId)
+ " in item layout");
}
final String item = getItem(position);
viewHolder.name.setText(item);
viewHolder.name.setTypeface(Typeface.createFromAsset(
MarsPDA.assetManager, "fonts/prototype.ttf"));
return view;
}
class ViewHolder {
TextView name;
ViewHolder(View v) {
name = v.findViewById(R.id.name_label);
}
}
private class CardsFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if (constraint != null) {
final List<String> suggestions = new ArrayList<>();
final FilterResults fs = new FilterResults();
return fs;
} else {
return new FilterResults();
}
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results != null && results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
}
}
performFiltering
的此实现显然使得没有显示建议。
[我尝试从原始performFiltering
类复制ArrayAdapter
方法,并研究了在该论坛上发现的Filter
的其他一些实现,但是,即使我实际上从字面上将任何内容添加到suggestions
列表并设置了fs.values = suggestions;
和fs.count = suggestions.size();
,适配器也会显示传递给构造函数的names
数组的所有成员。为什么会这样?
我认为问题出在管理列表中,您可以尝试以下更改声明原始列表和过滤器,然后在构造函数中对其进行初始化。