2011-04-26 26 views
26

Tengo una matriz de cadenas con las que estoy rellenando un objeto Spinner. Sin embargo, me gustaría adjuntar una identificación a cada elemento del Spinner, por lo que cuando el usuario selecciona un elemento, tengo su ID para usar para guardar en algún otro dato. ¿Cómo puedo hacer esto?Configuración de ID para elementos Spinner

+2

I don' ¿Entiende, la posición del giradiscos o la matriz no es suficiente para usar como una identificación? – ferostar

+3

Es una identificación específica del artículo en el Spinner. Podría ser 1; podría ser 93847549387925187. Es una clave principal de base de datos. – Andrew

+1

Andrew tengo el mismo problema ... si tiene la respuesta a su pregunta que me ayude a ... –

Respuesta

17

¿Qué quieres decir con id. Puede usar ArrayAdapter para llenar el Spinner. Cuando se selecciona un elemento, simplemente obtenga el elemento del adaptador y guarde los datos que desee.

Spinner spinner = (Spinner) findViewById(R.id.spinner); 
ArrayAdapter<MyObject> adapter = ... // initialize the adapter 
adapter.setDropDownViewResource(android.R.layout.some_view); 
spinner.setAdapter(adapter); 

y cuando se selecciona elemento

public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 
    MyObject selected = parent.getItemAtPosition(pos); 
    // save any data relevant with selected item 
} 

Si va a almacenar sus datos en dB puede utilizar CursorAdapter y en onItemSelected para ir a buscar el identificador de elemento seleccionado desde el cursor.

+1

Si uso un CursorAdapter, ¿cómo le digo que la columna "nombre" es para el texto? que aparece en la lista? – Andrew

0

No creo que pueda adjuntar una ID arbitraria a elementos de un recurso de matriz de texto, si eso es lo que está usando.

Creo que la forma más sencilla de adjuntar una identificación sería a código fijo (si está utilizando un recurso de texto estático) o construir dinámicamente (si obtiene las cadenas en tiempo de ejecución) una asignación desde (posición de cadena en conjunto) -> (clave principal).

EDITAR: Por otro lado, Mojo Risin tiene un punto: debe verificar si la API CursorAdapter ya hace lo que necesita para usted.

-1

Creo que la mejor solución es añadir un spinner más y llenarlo con los identificadores, pero que la visibilidad de la misma a ido

+1

no lo creo ... si tiene una matriz de objetos que desea mostrar en la rueda giratoria, puede acceder más fácilmente a la ID seleccionada desde esta matriz de objetos, que accediendo al valor en otra rueda giratoria. – hendrix

+0

Esta no es una buena solución en absoluto. – tier1

32

Crear una clase StringWithTag y utilizar en lugar del nombre de la cadena en la lista como tal : -

public class StringWithTag { 
    public String string; 
    public Object tag; 

    public StringWithTag(String stringPart, Object tagPart) { 
     string = stringPart; 
     tag = tagPart; 
    } 

    @Override 
    public String toString() { 
     return string; 
    } 
} 

en las añadir elementos a parte spinner: -

List<StringWithTag> list = new ArrayList<StringWithTag>(); 
list.add(new StringWithTag("Oldman", "12345")); 
list.add(new StringWithTag("Umpire", "987654")); 
list.add(new StringWithTag("Squad", "ABCDEE")); 
ArrayAdapter<StringWithTag> adap = new ArrayAdapter<StringWithTag> (this, android.R.layout.simple_spinner_item, list); 
.... 
.... 

en el oyente: -

public void onItemSelected(AdapterView<?> parant, View v, int pos, long id) { 
    StringWithTag s = (StringWithTag) parant.getItemAtPosition(pos); 
    Object tag = s.tag; 
} 

voila! }

+0

donde obtienes StringWithTag? StringWithTag no se puede resolver con un tipo ... –

+5

@Robert ... err ... StringWithTag es algo creado como en el primer bloque de código anterior. – mfc

+2

¡Esta solución es elegante y perfecta! Esto también implementa el valor de la clave de Spinner como HTML