ListAdapter 过滤器不是使用字符串吗?

Posted

技术标签:

【中文标题】ListAdapter 过滤器不是使用字符串吗?【英文标题】:ListAdapter Filter other than using Strings? 【发布时间】: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 框架完全愚蠢的排除。过滤除字符串以外的任何内容?谁他妈需要那个?难以置信 【参考方案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

【讨论】:

以上是关于ListAdapter 过滤器不是使用字符串吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Kotlin 在 ListAdapter 中使用 Filterable?

在 Android 应用程序中使用 ListView 按字母顺序过滤 ListAdapter

getFilter() 不适用于 ListAdapter

在if语句,iOS中使用空字符串过滤字符串

使用 ListAdapter 将项目添加到 ListView

使用 ListAdapter 时出现 ArrayIndexOutOfBoundsException