过滤ListView - 而不是我认为它会如何工作../

时间:2011-05-17 01:39:18

标签: android listview filter

希望你能帮助我解决我一直遇到的问题。我有一个由编辑框过滤的列表视图。我认为它会根据edittext中的文本,通过listview中文本的任何部分进行过滤。因此,如果我在列表视图中有三个项目,“Cupcake”,“Donut”,“Eclair”和“Froyo”,我输入“cl”,它将不会返回任何内容......但如果我输入“ecl” “,它会回归”Eclair“。对不起,如果我措辞严厉......这有点难以解释。这是我的代码:

private EditText ed;
private String lv_arr[]={"Cupcake","Donut","Eclair","Froyo"};
ArrayAdapter<String> arrad;

public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.search);

     ed = (EditText) findViewById(R.id.edit);
     ListView list = (ListView) findViewById(R.id.listviewtest);
     arrad =  new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1 , lv_arr);
     list.setAdapter(arrad);
     list.setTextFilterEnabled(true);

     ed.addTextChangedListener(new TextWatcher() {
         @Override
         public void onTextChanged( CharSequence arg0, int arg1, int arg2, int arg3) {
             SearchByName.this.arrad.getFilter().filter(arg0);
         }

         @Override
         public void beforeTextChanged( CharSequence arg0, int arg1, int arg2, int arg3) {

        }

        @Override
        public void afterTextChanged( Editable arg0) {

        }
   });
}

1 个答案:

答案 0 :(得分:2)

如果你查看arrayadapter的源代码,它只会过滤你列表项中任何给定单词的第一个字母(所以给定一个“eclair donut”项目,它将匹配“ecl”或“don”但是不是“空气”或“坚果”: 这是ArrayAdapter.java的相关代码

      for (int i = 0; i < count; i++) {
            final T value = values.get(i);
            final String valueText = value.toString().toLowerCase();

            // First match against the whole, non-splitted value
            if (valueText.startsWith(prefixString)) {
                newValues.add(value);
            } else {
                final String[] words = valueText.split(" ");
                final int wordCount = words.length;

                for (int k = 0; k < wordCount; k++) {
                    if (words[k].startsWith(prefixString)) {
                        newValues.add(value);
                        break;
                    }
                }
            }
        }

如果要在单词的中间过滤模式的任何实例,则需要编写自己的适配器。实现Filterable