android listview 中的查找匹配问题adapter.getFilter().filter(c);

    科技2024-06-18  73

    最近发现自己写的一个小程序有个问题,在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,问题解决。

    Processed: 0.014, SQL: 8