使用子字符串搜索过滤ListView

时间:2016-08-04 19:05:43

标签: java android listview search filter

我希望以这样的方式过滤ListView:当用户在EditText项目中ListView中键入单词/字符串时,应该过滤该项目。

在下面的代码中,EditText会检查初始字符中的项目名称。我不需要那个。

例如:

列出项目:sachin,dhoni,yuvraj ......

的EditText:v ......

搜索结果应该显示 yuvraj

这是我的代码:

public void onTextChanged(CharSequence s, int start, int before, int count) {
            textlength = editText.getText().length();
            text_sort.clear();
            image_sort.clear();
            for (int i = 0; i < names.length; i++) {
                if (textlength <= names[i].length()) {
                    if (editText.getText().toString().equalsIgnoreCase((String)names[i].subSequence(0,textlength))) {
                        text_sort.add(names[i]);
                        image_sort.add(imageid[i]);
                    }
                }
            }
            listView.setAdapter(new MyCustomAdapter(text_sort, image_sort));
        }

3 个答案:

答案 0 :(得分:2)

就是这么简单,onTextChanged方法中的这一行就可以实现神奇的

adapter.getFilter()过滤器(一个或多个):

如果您有自定义适配器

,则可能需要实现Filterable

查看这一个教程

http://www.androidhive.info/2012/09/android-adding-search-functionality-to-listview/

答案 1 :(得分:0)

从我所看到的,您的姓名&#39;变量是一个包含所有正确名称的字符串数组吗?

两个相关事实:
1)您可以使用 for循环遍历列表。
2)此外,你可以比较字符串与 str1.toLowerCase()。contains(str2.toLowerCase()

此外,在listView.setAdapter()方法之外保留对适配器的引用,并在需要时重新分配它。 否则,您将创建该适配器的匿名实例,并最终溢出内存(即使是缓慢的)

...
private MyCustomAdapter adapter;
...

public void onTextChanged(CharSequence s, int start, int before, int count) {
    text_sort.clear();
    image_sort.clear();
    for (String name: names) {         
        if(name.toLowerCase().contains(s.getText().toLowerCase()) {
            text_sort.add(names[i]);
            image_sort.add(imageid[i]);
        }
    }
    adapter = new MyCustomAdapter(text_sort, image_sort)
    listView.setAdapter(adapter);
}

修改:

而不是使用:

  if(name.toLowerCase().contains(s.getText().toLowerCase())

检查您的字符串是否包含键入的字符串,您可以使用以下

  if(name.toLowerCase().startsWith(s.getText().toLowerCase())

检查字符串是否以您刚输入的字符串

开头

如果这解决了这个问题,请告诉我。

此致

答案 2 :(得分:0)

很抱歉你的代码无效....但是这对我有用(name [i] .indexOf(editText.getText()。tostring()!= - 1)