2012-01-28 35 views
10

Tengo un Spinner que se llena con un SimpleCursorAdapter. Mi cursor tiene algunos valores, pero necesito el Spinner para mostrar una opción vacía de forma predeterminada.Spinner con una selección predeterminada vacía

No quiero usar ArrayAdapter<String>, o CursorWrapper en esta aplicación, por alguna razón.

Debería haber una manera más simple de mostrar una opción vacía en el Spinner de forma predeterminada.

Respuesta

2

SpinnerOnItemSelectedListener se ejecuta en el tiempo de compilación, así que obtiene el primer elemento para ver en el artículo seleccionado Spinner.

Agregue un artículo ficticio (Cadena - nulo " ") en su SimpleCursorAdapter y use spinner.setSelected(int thatSpecificPostionYouJustAdded).

+0

Un ArrayAdapter tienen un método de 'añadir', pero el SimpleCursorAdapter refugiate ella. ¿Podría explicar cómo agregar un valor nulo con código, sin usar CursorWrapper ?. Gracias – AAP

+0

Lo siento por llegar tarde, puede ser [este] (http://stackoverflow.com/questions/8508678/how-to-add-an-item-to-simplecursoradapter) ayudará de alguna manera. – IronBlossom

3

simplemente Puede ocultar la vista no deseado en el adaptador spinner (getDropDownView):

En mi código de ejemplo, defaultposition es la posición de ocultar (como una posición "Seleccionar valor")

public class SpinnerOptionAdapter extends ArrayAdapter<optionsInfos> { 

... 

    @Override 

    public View getDropDownView(int position, View convertView, ViewGroup parent) 
    { // This view starts when we click the spinner. 
    View row = convertView; 
    if(row == null) 
    { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     row = inflater.inflate(R.layout.product_tab_produit_spinner_layout, parent, false); 
    } 

    ... 

    optionsInfos item = data.get(position); 


    if((item != null) && (position == defaultposition)) { 
     row.setVisibility(View.GONE); 
    } else { 
     row.setVisibility(View.VISIBLE); 
    } 

    .... 

    return row; 
} 


... 
} 
+0

Entiendo. Pero debes tener un ítem nulo, y no lo tengo en mi DB. ese es el verdadero problema. – AAP

2

Un método que a veces uso para agregar un registro adicional como una opción "vacía" con un SimpleCursorAdapter destinado a un Spinner es mediante el uso de una cláusula UNION en mi consulta de cursor. EMPTY_SPINNER_STRING podría ser algo así como: "- none specified -" o similar. Use una cláusula "ordenar por" para obtener primero su registro vacío y, por lo tanto, el valor predeterminado en el Spinner. Una forma cruda pero efectiva de obtener el resultado requerido sin cambiar los datos de la tabla subyacente. En mi ejemplo quiero solamente ciertas hilanderas que tengan un valor por defecto en blanco (los que tienen un modificador de tipo de "intensidad".

public Cursor getLOV(String modifier_type) 
//get the list of values (LOVS) for a given modifier 
{ 
    if (mDb == null) 
    { 
     this.open(); 
    } 
    try { 
     MYSQL = "SELECT _ID AS '_id', code, name, type as 'DESC', ordering FROM "+codeTab+" WHERE type = '"+modifier_type+"'" + 
       " ORDER BY ordering, LOWER(name)"; 
     if (modifier_type.equals("intensity")) { //then include a default empty record 
      MYSQL = "SELECT _ID AS '_id', code, name as 'NAME', type as 'DESC', ordering FROM "+codeTab+" WHERE type = '"+modifier_type+"'" + 
        " UNION SELECT 9999 AS '_id', '' AS 'code', '"+EMPTY_SPINNER_STRING+"' AS 'NAME', 'intensity' AS 'DESC', 1 AS ordering ORDER BY ordering, name"; 
     } 
     Log.d(TAG, "MYSQL = "+MYSQL); 
     return mDb.rawQuery(MYSQL, null); 
    } 
    catch (SQLiteException exception) { 
     Log.e("Database LOV query", exception.getLocalizedMessage()); 
     return null; 
    } 
} 
0

Después de configurar el adaptador. Llamar setSelection (i utilizado con 0) y justo después de que el conjunto el color del texto a transparente.

// Preselect the first to make the spinner text transparent 
    spinner.setSelection(0, false); 
    TextView selectedView = (TextView) spinner.getSelectedView(); 
    if (selectedView != null) { 
     selectedView.setTextColor(getResources().getColor(R.color.transparent)); 
    } 

a continuación, establezca su OnItemSelectedListener (si es necesario).

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 
     } 
    }); 

Esto hará que el control de giro en vacío primera vez visto. Pero, si el usuario selecciona el primer elemento, no hará nada porque 0 está pre seleccionado. Para arreglar esto, utilicé esta subclase de spinner. @ tomado de answer de Melquiades:


/** 
    * Spinner extension that calls onItemSelected even when the selection is the same as its previous value 
    */ 
public class FVRSpinner extends Spinner { 

    public FVRSpinner(Context context) { 
     super(context); 
    } 

    public FVRSpinner(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public FVRSpinner(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    public void setSelection(int position, boolean animate) { 
     boolean sameSelected = position == getSelectedItemPosition(); 
     super.setSelection(position, animate); 
     if (sameSelected) { 
      // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now 
      if (getOnItemSelectedListener() != null) { 
       getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId()); 
      } 
     } 
    } 

    @Override 
    public void setSelection(int position) { 
     boolean sameSelected = position == getSelectedItemPosition(); 
     super.setSelection(position); 
     if (sameSelected) { 
      // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now 
      if (getOnItemSelectedListener() != null) { 
       getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId()); 
      } 
     } 
    } 
}
Cuestiones relacionadas