我正在使用特殊的自动完成文本视图来提供成千上万条街道的建议。由于这个巨大的元素列表,我必须根据第一个输入字母实时清除和填充适配器。例如,当用户输入“b”时,适配器将被填充以所有以“b”开头的街道。这在所有Android版本中都有效。今天有一个用户告诉我,在Android 2.3.5,三星Galaxy Ace上存在问题。
当他开始输入字母时,没有下拉菜单提供建议。当他输入“b”时,它仅建议由两个名称组成且第二个名称以“b”开头的街道。例如:他对“b”的建议是“Am Bahnhof”或“Alte Bahnstraße”。似乎有一种模式,但我无法解释发生了什么,并且我无法在任何模拟器或实际设备上重现此模式(而且没有2.3.5模拟器)。
以下是代码。只是为了信息:我必须在beforeTextChange中清除它,否则当我非常快地删除字段中的输入时,应用程序会崩溃。显然,它无法快速交换列表。我需要变量alreadyAdded,否则当我将输入删除到第一个字母时,它会将列表添加两次。
真正奇怪的是:自从第一次实现以来,我从未更改过这部分,而用户告诉我它在第一个版本中起作用。但突然间它不再起作用了。编译后的代码是否可能被损坏?有什么想法吗?
如果有人能告诉我如何重现这个问题,我也可以接受解决方案。
调用:
当他开始输入字母时,没有下拉菜单提供建议。当他输入“b”时,它仅建议由两个名称组成且第二个名称以“b”开头的街道。例如:他对“b”的建议是“Am Bahnhof”或“Alte Bahnstraße”。似乎有一种模式,但我无法解释发生了什么,并且我无法在任何模拟器或实际设备上重现此模式(而且没有2.3.5模拟器)。
以下是代码。只是为了信息:我必须在beforeTextChange中清除它,否则当我非常快地删除字段中的输入时,应用程序会崩溃。显然,它无法快速交换列表。我需要变量alreadyAdded,否则当我将输入删除到第一个字母时,它会将列表添加两次。
真正奇怪的是:自从第一次实现以来,我从未更改过这部分,而用户告诉我它在第一个版本中起作用。但突然间它不再起作用了。编译后的代码是否可能被损坏?有什么想法吗?
如果有人能告诉我如何重现这个问题,我也可以接受解决方案。
调用:
autoCompleteTextView.addTextChangedListener(new StreetTextWatcher(adapter));
StreetArrayAdapter:
public class StreetArrayAdapter extends ArrayAdapter<String> {
public StreetArrayAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
}
public void addAll(String[] streets) {
for (String street : streets) {
add(street);
}
}
}
StreetTextWatcher:
public class StreetTextWatcher implements TextWatcher {
private final StreetArrayAdapter adapter;
private boolean alreadyAdded = false;
public StreetTextWatcher(StreetArrayAdapter adapter) {
this.adapter = adapter;
}
@Override
public void afterTextChanged(Editable s) {
//not used
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
if (s.length() < 1) {
adapter.clear();
alreadyAdded = false;
}
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() == 1) {
populateAdapter(s);
alreadyAdded = true;
}
}
private void populateAdapter(CharSequence s) {
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("a") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_A);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("ä") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_A);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("b") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_B);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("c") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_C);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("d") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_D);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("e") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_E);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("f") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_F);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("g") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_G);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("h") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_H);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("i") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_I);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("j") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_J);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("k") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_K);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("l") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_L);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("m") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_M);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("n") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_N);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("o") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_O);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("ö") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_O);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("p") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_P);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("q") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_Q);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("r") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_R);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("s") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_S);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("t") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_T);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("u") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_U);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("ü") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_U);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("v") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_V);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("w") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_W);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("y") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_Y);
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("z") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_Z);
}
}
}