[英]AutoCompleteTextView custom filter results are ignored
我為 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
數組的所有成員。 為什么會這樣?
我認為問題出在管理列表中,您可以嘗試以下更改聲明原始列表和過濾器,然后在構造函數中對其進行初始化。
覆蓋 get count 方法。
@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();
}
}
}
希望這會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.