似乎Filterable的Adapter的用例是通过用户可能在EditText中输入的String或CharSequence进行过滤,但这真的是平台提供的过滤Adapter的唯一条件吗?
如果我有一个对象的后备数据结构,而这些对象可以通过其他方式进行分类,那该怎么办?例如,如果我有一个具有enum属性color的衬衫对象列表,该怎么办?用户应该能够从可用的color列表中过滤衬衫列表。作为一个好的应用程序开发人员,我想使用内置的过滤机制的平台,但我能找到的就是这个带有filter (CharSequence constraint)等方法的Filter。我一定漏掉了什么。我看到在我自己的定制BaseAdapter中实现这种过滤机制是多么简单,但感觉应该有一些内置的方法来实现定制过滤器。有没有人?提前谢谢。
发布于 2014-11-25 14:10:01
在Android中,你的适配器可以实现 Filterable (这可能与你搜索的过滤器相同)
=>这是数据与过滤器之间的连接。
这里是链接
发布于 2015-02-04 23:05:21
你可以创建你自己的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;
}https://stackoverflow.com/questions/10015638
复制相似问题