首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用字符串以外的ListAdapter筛选器?

使用字符串以外的ListAdapter筛选器?
EN

Stack Overflow用户
提问于 2012-04-05 00:44:02
回答 2查看 476关注 0票数 14

似乎FilterableAdapter的用例是通过用户可能在EditText中输入的StringCharSequence进行过滤,但这真的是平台提供的过滤Adapter的唯一条件吗?

如果我有一个对象的后备数据结构,而这些对象可以通过其他方式进行分类,那该怎么办?例如,如果我有一个具有enum属性color的衬衫对象列表,该怎么办?用户应该能够从可用的color列表中过滤衬衫列表。作为一个好的应用程序开发人员,我想使用内置的过滤机制的平台,但我能找到的就是这个带有filter (CharSequence constraint)等方法的Filter。我一定漏掉了什么。我看到在我自己的定制BaseAdapter中实现这种过滤机制是多么简单,但感觉应该有一些内置的方法来实现定制过滤器。有没有人?提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2014-11-25 14:10:01

在Android中,你的适配器可以实现 Filterable (这可能与你搜索的过滤器相同)

=>这是数据与过滤器之间的连接。

这里是链接

票数 0
EN

Stack Overflow用户

发布于 2015-02-04 23:05:21

你可以创建你自己的FilterAdapter并带上你自己的逻辑,例如这个用两个字符串管理对象并管理过滤器:

代码语言:javascript
复制
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();
    }
}

}

在您的适配器中放入以下内容:

代码语言:javascript
复制
@Override
public Filter getFilter() {
    if (twoWordsFilter==null){
        twoWordsFilter=new TwoWordsFilter(branchDatas,this);
    }
    return twoWordsFilter;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10015638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档