2012-04-04 3 views
12

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

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

+0

FacebookSDK 3.0 действительно имеет способ фильтрации по другим параметрам. Проблема в том, что они внедрили новый класс фильтра с нуля. Для получения более подробной информации проверьте PickerFragment.GraphObjectFilter . – mach

+1

Я не могу поверить, что у этого вопроса больше нет взглядов и голосов. Реальность вопроса OP подчеркивает полное идиотское исключение из основной структуры Android. Фильтрация на чем-либо, кроме String? Кому это нужно? невероятно – wkhatch

ответ

0

В Android, адаптер может реализовать фильтруемых (которые могут быть одинаковыми с фильтром вы искали)
=> Это связь между вашими данными с фильтром.
Вот ссылка [Вы должны увидеть отмеченную ответ] List View Filter Android

0

вы можете создать свой собственный 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; 
} 
Смежные вопросы