14

のユースケースAdapterFilterableでフィルタリングすること、StringまたはCharSequenceでユーザーが入力する可能性があるようですがEditText、プラットフォームが をフィルタリングするために提供する唯一の基準は本当にこれAdapterですか?

別の方法で分類できるオブジェクトのバッキング データ構造がある場合はどうなりますか? たとえば、enum属性を持つシャツ オブジェクトのリストがある場合はどうすればよいcolorでしょうか? ユーザーは、利用可能な のリストからシャツのリストをフィルタリングできる必要がありますcolor。優れたアプリケーション開発者として、フィルタリング メカニズムに組み込まれたプラットフォームを使用したいと考えていますが、私が見つけることができるのはFilterfilter (CharSequence constraint). 私は何かが欠けているに違いない。このフィルタリング メカニズムを独自の custom 内に実装するのがいかに簡単かはわかりますがBaseAdapter、カスタム フィルタを実行する方法が組み込まれている必要があるように感じます。誰?前もって感謝します。

4

2 に答える 2

0

独自の FilterAdapter を作成し、独自のロジックを持ち込むことができます。たとえば、これは 2 つの文字列を持つオブジェクトを処理し、フィルターを管理します。

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;
}
于 2015-02-04T15:05:20.513 に答える