除了使用字符串之外的ListAdapter过滤器?

时间:2012-04-04 16:44:02

标签: android listview filter listadapter

Adapter Filterable的用例似乎是按StringCharSequence进行过滤,用户可能会在{{ 3}},但这是否是平台提供的唯一标准,用于过滤EditText s?

如果我有可以按其他方式分类的对象的后备数据结构怎么办?例如,如果我有一个具有enum属性{1}}的Shirt对象列表,该怎么办?用户应该能够从可用的color列表中过滤衬衫列表。作为一名优秀的应用程序开发人员,我想使用过滤机制中构建的平台,但我能找到的只有AdapterFilter方法。我肯定错过了什么。我看到在我自己的自定义filter (CharSequence constraint)中实现这种过滤机制是多么简单,但感觉应该有一些内置的方法来做自定义过滤器。任何人?提前谢谢。

2 个答案:

答案 0 :(得分:0)

在Android中,您的适配器可以实施 Filterable(可能与您搜索的Filter相同)
=>这是您的数据与过滤器之间的联系 链接在这里 [您应该看到标记的答案] List View Filter Android

答案 1 :(得分: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;
}