AutoCompleteTextView muestra'android.database.sqlite.SQLiteCursor@'… después de hacer la selección

Estoy utilizando el código siguiente para fijar el adaptador (SimpleCursorAdapter) para un AutoCompleteTextView

mComment = (AutoCompleteTextView) findViewById(R.id.comment); Cursor cComments = myAdapter.getDistinctComments(); scaComments = new SimpleCursorAdapter(this,R.layout.auto_complete_item,cComments,new String[] {DBAdapter.KEY_LOG_COMMENT},new int[]{R.id.text1}); mComment.setAdapter(scaComments); 

Auto_complete_item.xml

 <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 

Y thi es el xml para el control real

 <AutoCompleteTextView android:id="@+id/comment" android:hint="@string/COMMENT" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="18dp"/> 

La lista desplegable parece funcionar correctamente y muestra una lista de elementos. Cuando hago una selección de la lista consigo un objeto sqlite ('android.database.sqlite.SQLiteCursor @' …) en el textview. ¿Alguien sabe qué causaría esto, o cómo resolver esto?

Gracias

Ok puedo conectar en el evento OnItemClick, pero la parte TextView.setText () del widget AutoCompleteTextView se actualiza después de este punto. El evento OnItemSelected () nunca se dispara y el evento onNothingSelected () se activa cuando se muestran los elementos desplegables.

  mComment.setOnItemClickListener( new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub SimpleCursorAdapter sca = (SimpleCursorAdapter) arg0.getAdapter(); String str = getSpinnerSelectedValue(sca,arg2,"comment"); TextView txt = (TextView) arg1; txt.setText(str); Toast.makeText(ctx, "onItemClick", Toast.LENGTH_SHORT).show(); } }); mComment.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { Toast.makeText(ctx, "onItemSelected", Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub Toast.makeText(ctx, "onNothingSelected", Toast.LENGTH_SHORT).show(); } }); 

Alguien tiene alguna idea sobre cómo anular la actualización de TextView?

Gracias

Patricio

No creo que debería tener que actualizar el texto para el AutoCompleteTextView. Debería hacerlo automáticamente. Esto lo hace llamando al método [CursorAdapter.convertToString (…)] [1]. Si lees la descripción del método que señala esto. Así que si estuviera escribiendo su propio CursorAdapter, anularía ese método para devolver cualquier texto que desee mostrar en la lista de sugerencias. Este tipo hace un buen trabajo de explicar cómo hacerlo:

Línea 86 – http://thinkandroid.wordpress.com/2010/02/08/writing-your-own-autocompletetextview/

Sin embargo, puesto que está utilizando un SimpleCursorAdapter, no puede anular este método. En su lugar, necesita implementar / crear un [SimpleCursorAdapter.CursorToStringConverter] [2] y pasarlo a [SimpleCursorAdapter.setCursorToStringConverter (…)] [3]:

  SimpleCursorAdapter adapter = new SimpleCursorAdapter(context, layout, cursor, from, to); CursorToStringConverter converter = new CursorToStringConverter() { @Override public CharSequence convertToString(Cursor cursor) { int desiredColumn = 1; return cursor.getString(desiredColumn); } }; adapter.setCursorToStringConverter(converter); 

O si no desea crear un CursorToStringConverter a continuación, utilice el [SimpleCursorAdapter. Método setStringConversionColumn (…)] [4]. Pero creo que todavía tiene que establecer explícitamente el CursorToStringConverter a null:

  int desiredColumn = 1; adapter.setCursorToStringConverter(null); adapter.setStringConversionColumn(desiredColumn); 

Lo sentimos, pero el bloqueador de spam no me deja publicar los enlaces a la documentación de Android que describe los enlaces que he publicado anteriormente. Pero una búsqueda rápida de Google le indicará las páginas de doc correctas.

[Respuesta tardía, sólo para el registro. EDITed para eliminar mi sugerencia de que subclassing es necesario.]

Para utilizar SimpleCursorAdapter con AutoCompleteTextView, debe establecer dos controladores en el adaptador: The CursorToStringConverter y FilterQueryProvider . El seudocódigo sigue:

  adapter.setCursorToStringConverter(new CursorToStringConverter() { public String convertToString(android.database.Cursor cursor) { // Assume that "someColumn" contains the strings that we want to // use to identify rows in the result set. final int columnIndex = cursor.getColumnIndexOrThrow("someColumn"); final String str = cursor.getString(columnIndex); return str; } }); adapter.setFilterQueryProvider(new FilterQueryProvider() { public Cursor runQuery(CharSequence constraint) { // runSomeQuery will look for all rows in the database // that match the given constraint. Cursor cursor = runSomeQuery(constraint); return cursor; } }); 

Cuando hago una selección de la lista consigo un objeto sqlite ('android.database.sqlite.SQLiteCursor @' …) en el textview.

Usted no dice qué es este "texto" o cómo se relaciona con el Spinner .

Voy a tomar una suposición educada y asumir que usted está simplemente asignando el elemento seleccionado fuera de la Spinner en el TextView .

El elemento seleccionado de un Spinner con un SimpleCursorAdapter es un Cursor , apuntando a la fila que el usuario seleccionó. La implementación toString () de Cursor le dará algo parecido a android.database.sqlite.SQLiteCursor@ dependiendo de donde viene el Cursor .

Lo más probable es que desee llamar a getString() en ese Cursor , para recuperar algún valor de columna y asignarlo al TextView en cuestión.

Para solucionar el problema simplemente extendí SimpleCursorAdapter e implementé el método convertToString() . Entonces creé una instancia y la fijé como el adaptador.

Para permitir el filtrado en AutoCompleteTextView al usar CursorAdapters también usé setFilterQueryProvider() . Vea esta pregunta .

Mi clase extendida dentro de la actividad se ve así:

 private static class AutoCompleteCursorAdapter extends SimpleCursorAdapter { public AutoCompleteCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { super(context, layout, c, from, to); } @Override public CharSequence convertToString(Cursor cursor) { // This is the method that does the trick (return the String you need) return cursor.getString(cursor.getColumnIndex("name")); } } 
  • Android Studio: EditText editable es obsoleto Cómo utilizar inputType
  • Android: Widgets que no se muestran en el cajón de aplicaciones ICS
  • ¿Cómo puedo integrar mi aplicación con mi widget?
  • ¿Cómo configurar AutoCompleteTextView desplegable fondo transparente en Android?
  • Crea una barra lateral como el navegador Dolphin o Firefox en android
  • Android: Cómo colocar una imagen animada dentro de un EditText que podemos mostrar y ocultar
  • Poner muro de facebook en Android
  • Ajuste dinámico del contenido y del diseño del widget al tamaño que el usuario haya definido mediante el cambio de tamaño. Androide
  • Android App Widget - AsyncTask API llamada en la actualización
  • Cómo cambiar la altura de la vista de lista progmmatically ..?
  • Bibliotecas de código abierto de Android? ¿Vistas reutilizables, ViewGroups, adaptadores etc?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.