【问题标题】:Filter a ListView with substring search使用子字符串搜索过滤 ListView
【发布时间】:2016-08-04 19:05:43
【问题描述】:

我想过滤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));
        }

【问题讨论】:

标签: java android listview search filter


【解决方案1】:

很简单,只要 onTextChanged 方法中的这一行就可以了

adapter.getFilter().filter(s):

如果您有自定义适配器,您可能需要实现 Filterable

查看这个教程

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

【讨论】:

    【解决方案2】:

    抱歉,您的代码不起作用....但这对我有用 if(names[i].indexOf(editText.getText().tostring()!=-1)

    【讨论】:

      【解决方案3】:

      据我所知,您的“names”变量是一个包含所有正确名称的字符串数组?

      两个相关的事实:
      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())
      

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

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

      问候,

      【讨论】:

      • 这似乎工作....但是你能不能让它像例如:sachin tendulkar ......每个单词的起始字符......意味着如果我搜索't'。 ...应该显示sachin tenulkar
      • 检查我的更新。投票并检查它是否解决了您的问题。如果没有,请告诉我。问候
      • 因为该示例使用对象 for 循环而不是数组 for 循环.. 在这里检查差异:stackoverflow.com/questions/256859/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 2019-09-17
      • 2018-09-24
      • 1970-01-01
      • 2016-04-30
      • 2013-02-17
      相关资源
      最近更新 更多