AutoCompleteTextView no muestra sugerencias en Android 2.3.5

Estoy usando un autocompletetextview especial para sugerencias de miles de calles. Debido a esta enorme lista de elementos, tengo que borrar y rellenar el adaptador al instante dependiendo de la primera letra de entrada. Por ejemplo, cuando el usuario introduce "b", el adaptador se está poblando con todas las calles que comienzan con "b". Esto funciona en todas las versiones de Android. Hoy un usuario me dijo que hay problemas en Android 2.3.5, Samsung Galaxy Ace.

Cuando empieza a introducir letras, no hay ninguna lista desplegable con sugerencias. Cuando entra en "b", sólo sugiere calles que consisten en dos nombres mientras que el segundo nombre comienza con "b". Por ejemplo: las propuestas que obtiene para "b" es "Am Bahnhof" o "Alte Bahnstraße". Parece que hay un patrón, pero no puedo explicar cómo esto sucede y no puedo reproducir esto, ni en cualquier emulador ni en un dispositivo real (además no hay emulador 2.3.5).

A continuación se muestra el código. Sólo para información: Tengo que borrar en beforeTextChange, de lo contrario la aplicación se bloquea cuando elimino la entrada en el campo muy rápidamente. Obviamente, no puede intercambiar las listas lo suficientemente rápido. Y necesito la variable alreadyAdded, de lo contrario agregaría la lista dos veces cuando borre la entrada hasta la primera letra.

Lo que es realmente extraño: nunca he cambiado esta parte desde la primera implementación y el usuario me dijo que funcionaba en la primera versión. Pero suddendly no funciona más. ¿Es posible que el código compilado sea algo corrupto? ¿Algunas ideas?

También aceptaría una solución cuando alguien pudiera decirme cómo reproducir esto.

Invocación:

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); } } } 

Hice un comentario sobre la optimización … pero ya que estoy pegando el código .. Quería mantener el formato de modo que estoy pegando como la respuesta a pesar de que esto no responde a su pregunta.

Aquí es cómo yo habría escrito el código para que sea más fácil de cambiar / añadir / mantener …

 @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.length() == 1) { if (!alreadyAdded) { alreadyAdded = true; populateAdapter(s); } } } private void populateAdapter(CharSequence s) { Object arr[][] = {{"a", StreetNames.STREETS_A }, {"ä", StreetNames.STREETS_A }, {"b", StreetNames.STREETS_B }, {"c", StreetNames.STREETS_C }, {"d", StreetNames.STREETS_D }, {"e", StreetNames.STREETS_E }, {"f", StreetNames.STREETS_F }, {"g", StreetNames.STREETS_G }, {"h", StreetNames.STREETS_H }, {"i", StreetNames.STREETS_I }, {"j", StreetNames.STREETS_J }, {"k", StreetNames.STREETS_K }, {"l", StreetNames.STREETS_L }, {"m", StreetNames.STREETS_M }, {"n", StreetNames.STREETS_N }, {"o", StreetNames.STREETS_O }, {"ö", StreetNames.STREETS_O }, {"p", StreetNames.STREETS_P }, {"q", StreetNames.STREETS_Q }, {"r", StreetNames.STREETS_R }, {"s", StreetNames.STREETS_S }, {"t", StreetNames.STREETS_T }, {"u", StreetNames.STREETS_U }, {"ü", StreetNames.STREETS_U }, {"v", StreetNames.STREETS_V }, {"w", StreetNames.STREETS_W }, {"y", StreetNames.STREETS_Y }, {"z", StreetNames.STREETS_Z }}; for (int i=0; i<arr.length; i++) { if (s.toString().toLowerCase(Locale.GERMAN).startsWith(arr[i][0])) { adapter.addAll(arr[i][1]); break; } } } 

utilice el siguiente código para AutoCompletar TextView

MainActivity.java

 public class MainActivity extends Activity { AutoCompleteTextView autoCompleteTextView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); autoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.AndroidBooks); StreetArrayAdapter adapter = new StreetArrayAdapter(MainActivity.this, android.R.layout.simple_gallery_item); autoCompleteTextView.setThreshold(1); autoCompleteTextView.setAdapter(adapter); autoCompleteTextView.addTextChangedListener(new StreetTextWatcher( autoCompleteTextView, adapter)); } } 

main.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <AutoCompleteTextView android:id="@+id/AndroidBooks" android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="text"> </AutoCompleteTextView> </LinearLayout> 

StreetArrayAdapter.java

 public class StreetArrayAdapter extends ArrayAdapter<String> { String TAG = getClass().getSimpleName(); public StreetArrayAdapter(Context context, int textViewResourceId) { super(context, textViewResourceId); } public void addAll(String[] streets) { for (String street : streets) { Log.v(TAG, "street = " + street); add(street); } } @Override public void insert(String object, int index) { super.insert(object, index); } @Override public void notifyDataSetChanged() { super.notifyDataSetChanged(); } @Override public void setDropDownViewResource(int resource) { super.setDropDownViewResource(resource); } @Override public View getView(int position, View convertView, ViewGroup parent) { return super.getView(position, convertView, parent); } } 

StreetTextWatcher.java

 public class StreetTextWatcher implements TextWatcher { private final StreetArrayAdapter adapter; private boolean alreadyAdded = false; String TAG = getClass().getSimpleName(); AutoCompleteTextView autoCompleteTextView; public StreetTextWatcher(AutoCompleteTextView autoCTV,StreetArrayAdapter adapter) { this.adapter = adapter; autoCompleteTextView = autoCTV; } @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) { Log.v(TAG, "char ---> = "+ s); if (s.length() == 1) { populateAdapter(s); alreadyAdded = true; } } private void populateAdapter(CharSequence s) { if (s.toString().toLowerCase(Locale.GERMAN).startsWith("a") && !alreadyAdded) { Log.v(TAG, "inside A"); 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); } autoCompleteTextView.setAdapter(adapter); } } 

StreetNames.java

 public class StreetNames { public static String[] STREETS_A = {"Apple", "Ant", "ana","alia"}; public static String[] STREETS_B = {"Ball", "Baby","banana","bear"}; public static String[] STREETS_C = {"Cat", "Coffee", "cherry", "carrot"}; public static String[] STREETS_D = {"Doll", "Dady", "dj", "don"}; public static String[] STREETS_E = {"Elephant", "Eye", "earing", "easy"}; /* . . */ public static String[] STREETS_Z = {"Zebra", "Zero", "zzz", "zoya"}; } 

Avísame si tienes alguna consulta …

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.