2010-08-26 25 views
16

¿Es posible mostrar entradas particulares en una lista de Spinner como deshabilitadas?Cómo deshabilitar un elemento en un Spinner

Es decir, quiero mostrar siempre una ruleta con cuatro entradas (norte, sur, este y oeste, por ejemplo), pero quiero poder desactivar cualquiera de ellas para que aparezca en gris y no seleccionable .

¿Es esto posible, o tendré que volver a crear la lista cada vez, omitiendo las entradas no válidas?

+0

posible duplicado de [color del texto del cambio androide de artículos en spinner] (http://stackoverflow.com/questions/5836254/android-change-text-color-of-items-in-spinner) –

+1

@Jason, es lo mismo, pero el mío estaba aquí primero. ¿Eso no hace que sea el duplicado? – FrinkTheBrave

+0

no importa quién fue el duplicado, solo que existen duplicados y se pueden archivar como tales. – Corey

Respuesta

3

Es esto posible

No parece así. La forma en que haría eso con ListView implica areAllItemsEnabled() y isEnabled(). Sin embargo, esos son métodos en la interfaz ListAdapter, no en la interfaz SpinnerAdapter. Entonces, sospecho que serán ignorados por un Spinner.

4

Alguien acaba de publicar una solución a su problema, consulte este old post.

+4

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. –

+0

@AaronHall es un enlace al desbordamiento de la pila, por lo que es muy probable que el enlace siga siendo viable. – royhowie

25
// Create spinner month, and disable month < today 
    List<CharSequence> listMonth = new ArrayList<CharSequence>(); 
    for (int m = 0; m < 12; m++) { 
     if (m < 9) { 
      listMonth.add("0" + (m + 1)); 
     } else { 
      listMonth.add("" + (m + 1)); 
     } 
    } 
     // Create spinner item 
    adapterMonth = new ArrayAdapter<CharSequence>(this, 
      R.layout.layout_spinner_item, listMonth) { 
     // Disable click item < month current 
     @Override 
     public boolean isEnabled(int position) { 
      // TODO Auto-generated method stub 
      if (year <= max_year && position < max_month - 1) { 
       return false; 
      } 
      return true; 
     } 
     // Change color item 
     @Override 
     public View getDropDownView(int position, View convertView, 
       ViewGroup parent) { 
      // TODO Auto-generated method stub 
      View mView = super.getDropDownView(position, convertView, parent); 
      TextView mTextView = (TextView) mView; 
      if (year <= max_year && position < max_month - 1) { 
       mTextView.setTextColor(Color.GRAY); 
      } else { 
       mTextView.setTextColor(Color.BLACK); 
      } 
      return mView; 
     } 
    }; 

    adapterMonth 
      .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spn2.setAdapter(adapterMonth); 
+0

¡Funcionó como un encanto freakkiiiing! ¡Gracias! :) –

+0

Eso es correcto, pero en lugar de 'TextView mTextView = (TextView) mView;' tiene que usar 'TextView mTextView = (TextView) mView.findViewById (R.layout.layout_spinner_item);' –

2
public class MySpinnerAdapter extends BaseAdapter { 

    @Override 
    public void isEnabled(int position) { 
     return getItem(position).isEnabled(); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if(convertView == null) { 
      convertView = View.inflate(parent.getContext(), R.layout.item, null); 
     } 
     if(!isEnabled(position)) { 
      convertView.setEnabled(false); 
      convertView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //NO-OP: Just intercept click on disabled item 
      } 
      }); 
     } 

     return convertView; 
    } 
} 
Cuestiones relacionadas