I'm using a special autocompletetextview for suggestions of thousands of streets. Due to this huge element list, I have to clear and populate the Adapter on the fly depending on the first input letter. For example, when the user enters "b", the Adapter is being populated with all streets beginning with "b". This works in all Android versions. Today one user told me that there are problems in Android 2.3.5, Samsung Galaxy Ace.
When he begins to enter letters, there is no dropdown with suggestions. When he enters "b", it only suggest streets which consist of two names while the second name begins with "b". For example: the proposals he get for "b" is "Am Bahnhof" or "Alte Bahnstraße". There seems to be a pattern, but I can't explain how this happens and I can't reproduce this, neither in any emulator nor on a real device (moreover there is no 2.3.5 emulator).
Below is the code. Just for information: I have to clear in beforeTextChange, otherwise the application would crash when I delete the input in the field very quickly. Obviously it can't exchage the lists fast enough. And I need the variable alreadyAdded, otherwise it would add the list twice when I delete the input down to the first letter.
What is really strange: I've never changed this part since the first implementation and the user told me it worked at the first version. But suddendly it doesn't work anymore. Is it possible that the compiled code is somehow corrupt? Any ideas?
I would also accept a solution when somebody could tell me how to reproduce this.
Invocation:
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);
}
}
}