2012-04-04 43 views
12

看來,用例的AdapterFilterable是由StringCharSequence可能由用戶在EditText輸入來過濾,但事實真的是平臺提供的唯一標準用於過濾Adapter S'ListAdapter使用字符串以外的其他過濾器?

如果我有可以另外分類的對象的支持數據結構怎麼辦?例如,如果我有一個襯衫對象列表,它具有enum屬性,color?用戶應該能夠從可用的color s列表中篩選襯衫列表。作爲一名優秀的應用程序開發人員,我想使用內置過濾機制的平臺,但我可以找到的這個Filterfilter (CharSequence constraint)等方法。我肯定錯過了什麼。我看到如何在我自己的自定義BaseAdapter內部實現這個過濾機制足夠簡單,但感覺應該有一些內置的方法來執行自定義過濾器。任何人?提前致謝。

+0

FacebookSDK 3.0確實可以對其他參數進行過濾。問題在於他們已經從頭開始實施新的過濾器類。 有關更多詳細信息,請檢查PickerFragment.GraphObjectFilter 。 – mach 2013-03-20 10:26:05

+1

我不能相信這個問題沒有更多的意見和票。 OP的問題背後的現實強調了對android核心框架的完全白癡排斥。過濾String以外的任何東西?他到底需要誰?難以置信的 – wkhatch 2014-02-04 20:56:25

回答

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; 
}