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
- ¿Cómo crear un botón transparente?
- Cambiar la visibilidad del widget al hacer clic
- Cómo acoplar el diseño relativo al fondo de la pantalla
- Cómo utilizar el widget de NumberPicker Android 4.0
- Android: ¿Cómo cambiar el tamaño del texto en un campo EditarTexto?
<?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
- Cómo establecer fuentes personalizadas en estilos en negrita
- Widget no eliminado al pasar RESULT_CANCELED como resultado de la actividad de configuración
- Error XML en Eclipse mientras se visualiza el diseño gráfico de Xml
- Actualizar datos en Arrayadapter
- Cierre del Popup en Android
- Android: alinear el centro LinearLayout para todos los tamaños de pantalla
- Cómo agregar iconos a las entradas de PreferenceScreen
- ¿Cómo puedo aumentar el área táctil para los controles (ToggleButton)?
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")); } }
- El GestureDetector no funciona (ejemplo de desarrollador android)
- IllegalStateException con PagerAdapter