2 回答
TA贡献1801条经验 获得超16个赞
ArrayAdapter
的内置函数Filter
使用toString()
模型类的返回值(即其类型参数)来执行其过滤比较。Filter
如果您能够覆盖User
的toString()
方法以返回您想要比较的内容,则不一定需要自定义实现(前提是其过滤算法适合您的情况)。在这种情况下:
@Override public String toString() { return name; }
为了明确该算法是什么,ArrayAdapter
的默认过滤如下:
过滤器String
首先转换为小写。然后,遍历数据集,将每个值的toString()
返回值转换为小写,并检查它是否startsWith()
为 filter String
。如果是,则将其添加到结果集中。如果不是,则执行第二次检查,将值的小写字母String
拆分为空格 ( " "
),并将其中的每个值与过滤器进行比较,再次使用startsWith()
. 基本上,它首先检查整个内容是否以过滤器文本开头,然后在必要时检查每个单词。
如果这是一个合适的过滤器,那么这个解决方案是迄今为止最简单的。
如果这不能满足您的需求,并且您确实需要自定义Filter
实现,那么您不应该一ArrayAdapter
开始就使用。ArrayAdapter
维护private List
原始和过滤集合的internal, s - 最初从构造函数调用中传递的集合填充 - 您无权访问这些。这就是为什么显示的自定义Filter
尝试不起作用的原因,因为显示的项目计数和返回的项目getItem(position)
来自该内部过滤器List
,而不是内置的自定义过滤器Filter
。
在这种情况下,您应该直接进行子类化BaseAdapter
,List
为原始集合和过滤集合维护自己的s。您可以使用ArrayAdapter
's source作为指南。
确实,ArrayAdapter
在选择Adapter
扩展时通常是错误的选择。ArrayAdapter
是专为单数,有些简单化的目标:将在平板String
上的单个TextView
在每个列表项。在某些情况下,子类化ArrayAdapter
而不是BaseAdapter
毫无意义和/或多余。例如:
覆盖
getView()
而不使用View
从调用返回的super.getView()
.TextView
无论出于何种原因,手动设置自己的文本。维护和使用您自己的收藏;即,数组,或
List
s,或者你有什么。
在这些和某些其他情况下,可以说BaseAdapter
从一开始就使用它会更好。使用ArrayAdapter
比具有基本功能的单个文本项更复杂的任何内容会很快变得麻烦且容易出错,而且通常麻烦多于其价值。
最后,我要提到的ListView
是,在撰写本文时,尽管尚未正式发布,但目前基本上已弃用。目前的建议是RecyclerView
改用。但是,对于那些刚接触 Android 编程的人来说,ListView
作为了解此类回收适配器的整体设计的开始步骤,仍然是有用的View
。RecyclerView
一开始可能有点不知所措。
TA贡献1869条经验 获得超4个赞
Filter myFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
ArrayList<User> tempList=new ArrayList<User>();
// Add the filter code here
if(constraint != null && users!=null) {
int length= users.size();
int i=0;
while(i<length){
User item= users.get(i);
//do whatever you wanna do here
//adding result set output array
if() { // Add check here, and fill the tempList which shows as a result
tempList.add(item);
}
i++;
}
//following two lines is very important
//as publish result can only take FilterResults users
filterResults.values = tempList;
filterResults.count = tempList.size();
}
return filterResults;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence contraint, FilterResults results) {
users = (ArrayList<User>) results.values;
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
};
最后,重写此方法并返回过滤器实例。
@Override
public Filter getFilter() {
return myFilter;
}
有关更多参考,请参阅https://gist.github.com/tobiasschuerg/3554252
添加回答
举报