Spinner, personalizar cada item individualmente.

4,030 views
Skip to first unread message

Pao

unread,
Oct 25, 2010, 5:32:52 AM10/25/10
to desarrolladores-android
Buenas,

Estoy intentando hacer un comboBox en el que cada item esté
personalizado individualmente. Para el Combobox estoy empleando el
objeto Spinner, y los elementos son colores:

Azul
Rojo
Naranja
Verde...

De esta forma me gustaría que el color del texto "Azul" fuera azul, el
de rojo "Rojo", y demás, de forma que sea más visual para el usuario a
la hora de elegir.

Por ahora he conseguido cambiar el color del texto, pero de todos los
items a la vez de forma que todo que quedan en azul por ejemplo. Esto
l he hecho cambiando el estilo de todo el Spinner pero como podría
asignar un estilo a cada Spinner?

He visto en un foro que se podría hacer implementando tu propio
Adapter de forma que heredara de SimpleCursorAdpater y así se podría
asignar un estilo a cada elemento, pero la verdad esq aún no controlo
mucho los adapter y no sé como plantearlo...

¿COmo podría asignarle a cada elemento del Spinner un color distinto?

Muchas gracias de antemano.

Saludos!

Estiven Restrepo

unread,
Oct 25, 2010, 8:41:24 AM10/25/10
to desarrollad...@googlegroups.com
Hola!!

Efectivamente se hace creando tu propio adapter al igual que se hace con el List.. simplemente que ahora se lo aplicas a un Spinner... en ApiDemos  hay un ejemplo de como hacerlo para las listas: EffiicientAdapter  en este ejemplo cambian el icono de cada item..

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html

De este ejemplo debes revisar muy bien la subclase..
EfficientAdapter extends BaseAdapter

Esa es la que vas a necesitar para hacer los cambios necesarios en el Spinner.

Espero sea de ayuda!!

Saludos,
Estiven Restrepo
http://www.androidcolombia.com
http://www.mdeplus.com


2010/10/25 Pao <olap...@gmail.com>

--
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a desarrolladores-a...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/desarrolladores-android?hl=es.


Estiven Restrepo

unread,
Oct 25, 2010, 8:47:18 AM10/25/10
to desarrollad...@googlegroups.com
Hola!

Se me olvidaba un detalle..  cuando se va usar un Adapter para un Spinner hay que tener clara la diferencia entre los métodos:

getView y  getDropDownView

Uno es para cuando esta desplegado el Spinner y el otro es cómo se muestra en el Spinner sin desplegarlo..
2010/10/25 Estiven Restrepo <estiv...@gmail.com>

Pao

unread,
Oct 25, 2010, 3:55:51 PM10/25/10
to desarrolladores-android
Gracias por la pista!

Ya estoy sobre ello.

Saludos!

On 25 oct, 14:47, Estiven Restrepo <estiven...@gmail.com> wrote:
> Hola!
>
> Se me olvidaba un detalle..  cuando se va usar un Adapter para un Spinner
> hay que tener clara la diferencia entre los métodos:
>
> getView y  getDropDownView
>
> Uno es para cuando esta desplegado el Spinner y el otro es cómo se muestra
> en el Spinner sin desplegarlo..
>
> Saludos,
> Estiven Restrepohttp://www.androidcolombia.comhttp://www.mdeplus.com
>
> 2010/10/25 Estiven Restrepo <estiven...@gmail.com>
>
> > Hola!!
>
> > Efectivamente se hace creando tu propio adapter al igual que se hace con el
> > List.. simplemente que ahora se lo aplicas a un Spinner... en ApiDemos  hay
> > un ejemplo de como hacerlo para las listas: EffiicientAdapter  en este
> > ejemplo cambian el icono de cada item..
>
> >http://developer.android.com/resources/samples/ApiDemos/src/com/examp...
>
> > De este ejemplo debes revisar muy bien la subclase..
>
> > EfficientAdapter extends BaseAdapter
>
> > Esa es la que vas a necesitar para hacer los cambios necesarios en el
> > Spinner.
>
> > Espero sea de ayuda!!
>
> > Saludos,
> > Estiven Restrepo
> >http://www.androidcolombia.com
> >http://www.mdeplus.com
>
> > 2010/10/25 Pao <olapa...@gmail.com>
> >> desarrolladores-a...@googlegroups.com<desarrolladores-android%2Bunsu...@googlegroups.com>

Pao

unread,
Nov 2, 2010, 3:43:52 PM11/2/10
to desarrolladores-android
Buenas,

Llevo unos días con ello, pero no consigo dar con el problema.

He creado un nuevo Adapter,MyAdapter que extiende de baseAdapter como
en el ejemplo que hay en API Demos para las listas. La diferencia es
que en lugar de extender la clase que lo llama de ListActivity
exitiende de Activity a secas, al querer usarlo para personalizar un
Spinner.

He sustituido el ArrayAdapter que leia los datos de mi array (en un
xml en local) para escribrilos en el Spinner, por myAdapater de la
siguiente manera:

Spinner s3 = (Spinner) findViewById(R.id.spinnerColor);
arrayColor = getResources().getStringArray(R.array.color);

MyAdapter adapter3=new MyAdapter(c,arrayColor);

// ArrayAdapter adapter3 = ArrayAdapter.createFromResource(
// this, (R.array.color), R.layout.my_normal_spinner_item_style);
//
adapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

s3.setAdapter(adapter3);

(De forma que las lineas comentadas son las que he sustituido por las
tres primeras.

En la clase Myadapter he implementado los métodos getView y
getDropDownView siguiendo la linea del EfficientAdapter del ejemplo,
pero el problema es que aunque no obtengo ningun error, los items del
Sppiner simplemente no muestran el texto de los arrays. No estoy
haciendo bien la referencia.

Alguna idea de porque es? La llamada es asi como la hago?

Gracias de antemano!

Saludos,

Paola.

Estiven Restrepo

unread,
Nov 2, 2010, 4:33:02 PM11/2/10
to desarrollad...@googlegroups.com
Hola!!

Según veo lo estas llamando de forma adecuada, el problema debe estar en la clase MyAdapter, si quieres muestranos el código para ayudarte con ello.
2010/11/2 Pao <olap...@gmail.com>

Pao

unread,
Nov 2, 2010, 6:06:33 PM11/2/10
to desarrolladores-android
El getView que he implementado es el siguiente:

/**
* Make a view to hold each row.
*
* @see android.widget.ListAdapter#getView(int, android.view.View,
* android.view.ViewGroup)
*/
public View getView(int position, View convertView, ViewGroup
parent) {
// A ViewHolder keeps references to children views to avoid
unnecessary calls
// to findViewById() on each row.
ViewHolder holder;

// When convertView is not null, we can reuse it directly,
there is no need
// to reinflate it. We only inflate a new View when the
convertView supplied
// by ListView is null.
if (convertView == null) {
convertView =
mInflater.inflate(R.layout.my_normal_spinner_item_style, null);

// Creates a ViewHolder and store references to the
two children views
// we want to bind data to.
holder = new ViewHolder();
holder.text = (TextView)
convertView.findViewById(R.id.textColor);
convertView.setTag(holder);

} else {
// Get the ViewHolder back to get fast access to the
TextView
// and the ImageView.
holder = (ViewHolder) convertView.getTag();
}

// Bind the data efficiently with the holder.

holder.text.setText(arrayColor[position]);
holder.text.setTextColor(0xFF0000);
return convertView;
}


Donde el R.layout.my_normal_spinner_item_style es:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/
android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>


<TextView
android:id="@+id/textColor"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>

</LinearLayout>

y el arrayColor.xml:

<resources>

<string-array name="color" >
<item>Blue</item>
<item>Green</item>
<item>Red</item>
<item>Yellow</item>
<item>Orange</item>
<item>Brown</item>
<item>Purple</item>
<item>Pink</item>
<item>Grey</item>
<item>White</item>
<item>Black</item>
</string-array>

</resources>

El getDropDownView lo he puesto idéntico al getView y ViewHolder:
static class ViewHolder {
TextView text;
}
On Nov 2, 9:33 pm, Estiven Restrepo <estiven...@gmail.com> wrote:
> Hola!!
>
> Según veo lo estas llamando de forma adecuada, el problema debe estar en la
> clase MyAdapter, si quieres muestranos el código para ayudarte con ello.
>
> Saludos,
> Estiven Restrepohttp://www.androidcolombia.comhttp://www.mdeplus.com
>
> 2010/11/2 Pao <olapa...@gmail.com>
>
>
>
> > Buenas,
>
> > Llevo unos días con ello, pero no consigo dar con el problema.
>
> > He creado un nuevo Adapter,MyAdapter que extiende de baseAdapter como
> > en el ejemplo que hay en API Demos para las listas. La diferencia es
> > que en lugar de extender la clase que lo llama de ListActivity
> > exitiende de Activity a secas, al querer usarlo para personalizar un
> > Spinner.
>
> > He sustituido el ArrayAdapter que leia los datos de mi array (en un
> > xml en local) para escribrilos en el Spinner, por myAdapater de la
> > siguiente manera:
>
> >        Spinner s3 = (Spinner) findViewById(R.id.spinnerColor);
> >                arrayColor = getResources().getStringArray(R.array.color);
>
> >                MyAdapter adapter3=new MyAdapter(c,arrayColor);
>
> > //              ArrayAdapter adapter3 = ArrayAdapter.createFromResource(
> > //                              this, (R.array.color),
> > R.layout.my_normal_spinner_item_style);
> > //
>
> > adapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_i­tem);
> > > > >> desarrolladores-a...@googlegroups.com<desarrolladores-androi­d%2Bunsu...@googlegroups.com>
> > <desarrolladores-android%2Bunsu...@googlegroups.com<desarrolladores-and­roid%252Buns...@googlegroups.com>
>
> > > > >> Para tener acceso a más opciones, visita el grupo en
> > > > >>http://groups.google.com/group/desarrolladores-android?hl=es.
>
> > --
> > Has recibido este mensaje porque estás suscrito al grupo
> > "desarrolladores-android" de Grupos de Google.
> > Para publicar una entrada en este grupo, envía un correo electrónico a
> > desarrollad...@googlegroups.com.
> > Para anular tu suscripción a este grupo, envía un correo electrónico a
> > desarrolladores-a...@googlegroups.com<desarrolladores-androi­d%2Bunsu...@googlegroups.com>
> > Para tener acceso a más opciones, visita el grupo en
> >http://groups.google.com/group/desarrolladores-android?hl=es.- Hide quoted text -
>
> - Show quoted text -

Pao

unread,
Nov 7, 2010, 3:23:54 PM11/7/10
to desarrolladores-android
He acotado el problema a la linea:

holder.text.setTextColor(0xFF0000);


Si pongo esta linea, el Spinner sale sin texto directamente.

He solucionado el problema sustituyendolo por :

holder.text.setTextColor(R.color.blue);

donde blue esta definido en "color.xml" guardado en res/values.

Con esta linea, sale el texto, pero sigo sin conseguir cambiar el
color, ya que parece que no aplica la linea, ya que el texto de los
elementos dle spinner no salen en azul.

SIn embargo, he probado tambie´n con la propiedad del color de fonod y
esta si la coge.
holder.text.setBackgroundResource(R.color.red);

Alguien sabe porque no coge el setTextColor?


Mcuhas gracias! Tiene que ser una tontería pero no consigo dar con
ello!

GRacias.
> > >http://groups.google.com/group/desarrolladores-android?hl=es.-Hide quoted text -

Ramón Invarato

unread,
Nov 8, 2010, 10:46:04 AM11/8/10
to desarrollad...@googlegroups.com
Tienes que coger los colores como recurso. Si no, solo te funcionarán los que tenga definidos Android (RED, GRAY, etc). Prueba con la siguiente línea de código:
TextView.setTextColor(contexto.getResources().getColor(R.color.blue));

Paola García

unread,
Nov 8, 2010, 2:20:17 PM11/8/10
to desarrollad...@googlegroups.com
YA está!

GraciaS!

Ray Carr

unread,
Oct 21, 2015, 7:24:50 PM10/21/15
to desarrolladores-android
Tengo que hacer lo mismo pero yo apenas estoy empezando con androide quería pedirte por favor nos compartieras tu código, el que funciona al 100. Te lo agradecería.
Reply all
Reply to author
Forward
This conversation is locked
You cannot reply and perform actions on locked conversations.
0 new messages