自动完成文本视图自定义筛选器结果将被忽略



>我已经为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的这种实现显然不会显示任何建议。

我尝试从原始ArrayAdapter类中复制performFiltering方法,并研究在此论坛上找到的其他一些Filter实现, 但即使我实际上将任何东西添加到suggestions列表中并设置fs.values = suggestions;fs.count = suggestions.size();,适配器也会显示传入构造函数的names数组的所有成员。 为什么会这样?

我认为问题出在管理列表中,您可以尝试以下更改 声明列表原始和过滤器,然后在构造函数中初始化它。

重写获取计数方法。

@Override
public int getCount() {
return names.size();
}

在筛选器类中进行更改,如下所示:

private class CardsFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();        // Holds the results of a filtering operation in values
List<String> FilteredArrList = new ArrayList<String>();
if (constraint == null || constraint.length() == 0) {
// set the Original result to return
results.count = namesOriginal.size();
results.values = namesOriginal;
} else {
constraint = constraint.toString().toLowerCase();
for (int i = 0; i < namesOriginal.size(); i++) {
String data = namesOriginal.get(i);
if (data.toLowerCase().startsWith(constraint.toString())) {
FilteredArrList.add(data);
}
}
// set the Filtered result to return
results.count = FilteredArrList.size();
results.values = FilteredArrList;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results != null && results.count > 0) {
names= (ArrayList<String>) results.values;
notifyDataSetChanged();
} else {
names.addAll(namesOriginal);
notifyDataSetInvalidated();
}
}
}

希望这会有所帮助。

最新更新