Фильтр ListAdapter, кроме использования строк?

Кажется, что вариант использования Adapter который является фильтруемым, должен фильтроваться с помощью String или CharSequence которые могут быть введены пользователем в EditText , но это действительно единственный критерий, который платформа предлагает для фильтрации Adapter s?

Что делать, если у меня есть резервная структура данных объектов, которые можно иначе классифицировать? Например, что, если у меня есть список объектов Shirt, у которых есть атрибут enum , color ? Пользователь должен иметь возможность фильтровать список рубашек из списка доступных color . Являясь хорошим разработчиком приложений, я хочу использовать платформы, встроенные в механизм фильтрации, но все, что я могу найти, это Filter с такими методами, как filter (CharSequence constraint) . Мне что-то не хватает. Я вижу, как было бы достаточно просто реализовать этот механизм фильтрации внутри моего собственного BaseAdapter , но похоже, что для BaseAdapter пользовательских BaseAdapter должен быть встроенный способ. Кто угодно? Заранее спасибо.

Solutions Collecting From Web of "Фильтр ListAdapter, кроме использования строк?"

В Android ваш адаптер может реализовать Filterable (это может быть одинаково с выбранным вами фильтром)
=> Это соединение между вашими данными с фильтром.
Вот ссылка [ Вы должны увидеть отмеченный ответ ] Список View Filter Android

Вы можете создать свой собственный FilterAdapter и привести свои собственные логики, например, этот объект заботится о двух строках и управляет фильтром:

 public class TwoWordsFilter extends Filter { ArrayList<BranchData> branchDatas = new ArrayList<BranchData>(); private BranchDataAdapter branchDataAdapter; public TwoWordsFilter(ArrayList<BranchData> branchDatas,BranchDataAdapter branchDataAdapter) { this.branchDatas = branchDatas; this.branchDataAdapter=branchDataAdapter; } @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); if (constraint==null || constraint.length()==0){ results.values=branchDatas; results.count=branchDatas.size(); }else { List<BranchData> mBranchDatas=new ArrayList<BranchData>(); for (BranchData branchData : branchDatas) { if (branchData.getBranch_name().trim().toLowerCase().startsWith(constraint.toString().trim().toLowerCase()) || branchData.getCity().trim().toLowerCase().startsWith(constraint.toString().trim().toLowerCase())){ mBranchDatas.add(branchData); } } results.values=mBranchDatas; results.count=mBranchDatas.size(); } return results; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { if (results.count == 0) branchDataAdapter.notifyDataSetInvalidated(); else { branchDataAdapter.setBranchDatas((ArrayList<BranchData>) results.values); branchDataAdapter.notifyDataSetChanged(); } } 

}

В вашем адаптере поставьте это:

 @Override public Filter getFilter() { if (twoWordsFilter==null){ twoWordsFilter=new TwoWordsFilter(branchDatas,this); } return twoWordsFilter; }