2012-01-28 7 views
10

Ho un Spinner che viene popolato utilizzando uno SimpleCursorAdapter. Il mio cursore ha alcuni valori, ma ho bisogno del Spinner per mostrare un'opzione vuota per impostazione predefinita.Spinner con una selezione predefinita vuota

Non voglio utilizzare ArrayAdapter<String> o CursorWrapper in questa app, per qualche motivo.

Ci dovrebbe essere un modo più semplice per mostrare un'opzione vuota nel Spinner per impostazione predefinita.

risposta

2

Spinner 's OnItemSelectedListener viene eseguito anche in fase di compilazione e recupera il primo elemento da visualizzare sull'elemento selezionato Spinner.

Aggiungere un elemento fittizio (String - null " ") sul SimpleCursorAdapter e utilizzare spinner.setSelected(int thatSpecificPostionYouJustAdded).

+0

Un ArrayAdapter hanno un metodo di 'aggiungere', ma il SimpleCursorAdapter leggere documenti in esso. Potresti spiegare come aggiungere un valore nullo con il codice, senza usare CursorWrapper ?. Grazie – AAP

+0

Ci scusiamo per il ritardo, potrebbe essere [questo] (http://stackoverflow.com/questions/8508678/how-to-add-an-item-to-simplecursoradapter) aiuterà in qualche modo. – IronBlossom

3

Si può semplicemente nascondere la vista indesiderato l'adattatore filatrice (getDropDownView):

Nel mio codice di esempio, defaultposition è la posizione di nascondere (come una posizione "Selezionare il valore")

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

Capisco. Ma devi avere un valore nullo, e non ce l'ho nel mio db. questo è il vero problema. – AAP

2

Un metodo che a volte utilizzo per aggiungere un record aggiuntivo come un'opzione "vuota" con un oggetto SimpleCursorAdapter destinato a uno Spinner consiste nell'utilizzare una clausola UNION nella query del cursore. EMPTY_SPINNER_STRING potrebbe essere qualcosa del tipo: "- none specified -" o simile. Utilizzare una clausola "order by" per ottenere prima il record vuoto e quindi il valore predefinito nello Spinner. Un modo grezzo ma efficace per ottenere il risultato richiesto senza modificare i dati della tabella sottostante. Nel mio esempio voglio soltanto alcuni filatori di avere un valore vuoto di default (quelli con un modificatore di tipo di "intensità".

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

Dopo aver impostato l'adattatore. Chiamare setSelection (io ho usato con 0) e subito dopo insieme il colore del testo trasparente.

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

Quindi, impostare l'OnItemSelectedListener (se necessario).

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 

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

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

Questo renderà il filatore vuoto a prima volta visto. Ma, se l'utente seleziona il primo elemento, non farà nulla perché 0 è pre selezionato. Per risolvere questo ho usato questa sottoclasse di spinner. tratto da @ di answer 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()); 
      } 
     } 
    } 
}