希望你能帮助我解决我一直遇到的问题。我有一个由编辑框过滤的列表视图。我认为它会根据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) {
}
});
}
答案 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