最近发现自己写的一个小程序有个问题,在listview列表的查找时,明显已经存在的,却查找不出来。例如 源字符串是“FDEFDG”,如果我查找FDE 就可以找到,查找DE 就匹配不出来,下面是我实现的方法
mEditSearch.addTextChangedListener(new TextWatcher(){ public void onTextChanged(CharSequence c, int start, int before, int count){ //在适配器是用内部方法getfilter()筛选数据 if (c != null && (c.toString()).trim().length() != 0&&adapter!=null){ adapter.getFilter().filter(c); //完成实时刷新listview adapter.notifyDataSetChanged(); } }其中getFilter()是android提供的查找类,其中的performFiltering()和publishResults()两个方法主要用于查找的实现和结果返回。 performFiltering()是执行过滤的方法,publishResults()是得到过滤结果的方法。
仔细看了下jdk源码,publishResults()用的是startwith()方法查找,该方法用于检测字符串是否以指定的前缀开始。下面是使用示例
public class Test { public static void main(String args[]) { String Str = new String("www.runoob.com"); System.out.print("返回值 :" ); System.out.println(Str.startsWith("www") ); System.out.print("返回值 :" ); System.out.println(Str.startsWith("runoob") ); System.out.print("返回值 :" ); System.out.println(Str.startsWith("runoob", 4) ); } }以上程序执行结果为:
返回值 :true 返回值 :false 返回值 :true好的。找到原因了,只要改变查找的方法就可以解决了问题。搜索了下,发现了indexOf 方法。indexOf 方法用于返回特定子字符串第一次在源字符串中的位置。如果源字符中不存在目标字符,则返回-1。
在自定义的适配器上继承Filterable 接口,然后重写 getFilter类中的performFiltering()方法,将startWith 改成indexOf,问题解决。