【问题标题】:ListAdapter Filter other than using Strings?ListAdapter 过滤器不是使用字符串吗?
【发布时间】:2012-04-18 10:16:02
【问题描述】:

似乎AdapterFilterable 的用例是通过StringCharSequence 进行过滤,这可能由用户在EditText 中输入,但这真的是唯一的吗平台为过滤Adapters 提供的标准?

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

【问题讨论】:

  • FacebookSDK 3.0 确实有一种过滤其他参数的方法。问题是他们从头开始实现了新的过滤器类。检查 PickerFragment.GraphObjectFilter 了解更多详情。
  • 我不敢相信这个问题没有更多的观点和赞成票。 OP 问题背后的现实强调了核心 android 框架完全愚蠢的排除。过滤除字符串以外的任何内容?谁他妈需要那个?难以置信

标签: android listview filter listadapter


【解决方案1】:

您可以创建自己的 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;
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多