Решения заканчивало тем обычай ArrayAdapter
подкласса, который присоединяет фильтр перед ArrayFilter
даже не видит.
Изменение основного приложения минимально, ему просто нужно создать экземпляр недавно окрещенного WtfArrayAdapter
и передать его конструктору дополнительный аргумент: ссылка на объект, содержащий метод нормализации (в текущем дизайне äpp, это MainActivity
класса, будущий рефакторинг будет лучше):
- ArrayAdapter acronymKeys = new ArrayAdapter(this,
- android.R.layout.simple_list_item_1, sorted);
+ ArrayAdapter acronymKeys = new WtfArrayAdapter(this,
+ android.R.layout.simple_list_item_1, sorted, this);
обычай WtfArrayAdapter
должен иметь возможность вызывать методы из ArrayFilter
(который ArrayAdapter
«s внутреннего частный класса), поэтому она должна принадлежать package android.widget;
.Я избавлю вас full imports, comments, etc. и воспроизводить важные детали ниже:
public class WtfArrayAdapter<T> extends ArrayAdapter<T> {
новых членов: - объект Предфильтровая метод нормализации в - наш внутренний частный класс объект - внутренний частный класс родителя 'объект (ArrayAdapter.mFilter
является private
, к сожалению)
private MainActivity sParent;
private WtfArrayFilter sFilter;
private Filter pFilter;
выдвинутом конструктор (нам необходимо реализовать только один, мы на самом деле вызов): - вызов унаследованного Конструктор - хранить вдали mFilter
значение родительского - экземпляр нашей собственной WtfArrayFilter
- хранить вдали объект Предфильтровая метод нормализации, поскольку WtfArrayFilter
потребуется позже
public WtfArrayAdapter(Context context, @LayoutRes int resource,
@NonNull T[] objects, MainActivity parent) {
super(context, resource, 0, Arrays.asList(objects));
sParent = parent;
sFilter = new WtfArrayFilter();
pFilter = super.getFilter();
}
Override ArrayAdapter
«s getFilter()
метод всегда возвращает наши новый WtfArrayFilter
:
public Filter getFilter() {
return sFilter;
}
Реализация WtfArrayFilter
как Filter
подкласса просто например ArrayFilter
, и пересылка всех буровых (т. без изменений) вызывают к унаследованным ArrayFilter
:
private class WtfArrayFilter extends Filter {
protected void publishResults(CharSequence constraint,
FilterResults results) {
pFilter.publishResults(constraint, results);
}
Нам нужно изменить только один метод, чтобы сделать нашу собственную фильтрацию перед вызовом унаследованного ArrayFilter
«s метода фильтрации:
protected FilterResults performFiltering(CharSequence prefix) {
return pFilter.performFiltering(prefix == null ? null :
sParent.normaliseAcronym(prefix.toString()));
}
}
}
Улучшения приветствуются, я все еще новичок Java ™.
Укажите код плз. –
как сделать вашу жизнь более трудной и реализовать материал 'Filter' вообще? откуда берутся данные для вашего автозаполнения? какова ваша модель данных? – pskink
@tinysunlight wellm есть ссылка на GitHub ... –