2010-01-29 11 views
10

estoy usando el siguiente código para establecer el adaptador (SimpleCursorAdapter) para un AutoCompleteTextViewAutoCompleteTextView pantallas 'android.database.sqlite.SQLiteCursor @' ... después de hacer la selección

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"/> 

el d ropdown parece funcionar correctamente y muestra una lista de elementos. Cuando hago una selección de la lista, obtengo un objeto sqlite ('android.database.sqlite.SQLiteCursor @' ...) en la vista de texto. ¿Alguien sabe qué podría causar esto o cómo resolver esto?

gracias

Ok soy capaz de enganchar en el caso OnItemClick, pero la porción 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 por primera vez.

 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

Patrick

Respuesta

0

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

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

Voy a tomar una conjetura y supongo que simplemente está asignando el elemento seleccionado fuera de Spinner en el TextView.

El artículo seleccionado de un Spinner usando un SimpleCursorAdapter es un Cursor, apuntando a la fila que seleccionó el usuario. La implementación de toString() de Cursor le dará algo similar a [email protected] dependiendo de dónde provenga el Cursor.

Es muy probable que desee llamar al getString() en ese Cursor, para recuperar algún valor de columna y asignarlo al TextView en cuestión.

+0

Sí, estás en lo correcto. Simplemente selecciono una de las opciones del control giratorio que se crea como parte de AutoCompleteTextView. ¿Dónde o cómo intercepto la función para procesar la selección? use getString() en el cursor, antes de que se establezca como el texto del control. También agregaré mi xml. – bugzy

+0

"¿Dónde o cómo interceptar la función para procesar la selección?" - ya lo está haciendo. En algún lugar, estás llamando 'setText()' en el TextView. Edita ese código. – CommonsWare

+0

Ese es el punto ... No lo soy. Es el comportamiento integrado del widget AutoCompleteTextView que está rellenando la porción TextView del widget AutoCompleteTextView. – bugzy

9

No creo que deba actualizar el texto de AutoCompleteTextView. Debería hacerlo automáticamente. Lo hace llamando al método [CursorAdapter.convertToString (...)] [1]. si lee la descripción del método, lo señala. Por lo tanto, si estuviera escribiendo su propio CursorAdapter, anularía ese método para devolver el texto que desea 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, dado que está utilizando un SimpleCursorAdapter, no se puede reemplazar 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 una CursorToStringConverter luego usa el [SimpleCursorAdapter. Método setStringConversionColumn (...)] [4]. Pero creo que todavía tiene que establecer explícitamente la CursorToStringConverter a nulo:

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 vínculos que he publicado anteriormente. Pero una búsqueda rápida en Google lo dirigirá a las páginas de documentación correctas.

3

[Última respuesta, solo para el registro. . Editado para quitar mi sugerencia de que la subclasificación es necesario]

Para utilizar SimpleCursorAdapter con un AutoCompleteTextView, es necesario establecer dos controladores del adaptador: El CursorToStringConverter y el FilterQueryProvider. Pseudocódigo siguiente:

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

para resolver el problema que acabo extendió SimpleCursorAdapter e implementado el método de convertToString(). Luego creé una instancia y la configuré como el adaptador.

Para permitir el filtrado en AutoCompleteTextView al usar CursorAdapters también utilicé setFilterQueryProvider(). See this question.

Mi clase extendida dentro de la actividad se ve como:

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")); 
    } 
} 
Cuestiones relacionadas