En la interfaz de usuario tiene que haber una ruleta que contenga algunos nombres (los nombres son visibles) y cada nombre tiene su propia identificación (las identificaciones no son iguales a la secuencia de visualización). Cuando el usuario selecciona el nombre de la lista, se debe cambiar la variable currentID.
La aplicación contiene la ArrayList
Donde Usuario es un objeto con ID y nombre:
public class User{
public int ID;
public String name;
}
Lo que no sé es cómo crear una ruleta que muestre la lista de nombres de usuarios y vincular los elementos de la ruleta a las ID, de modo que cuando el elemento de la ruleta se selecciona / cambia, la variable currentID se establece en el valor apropiado.
Agradecería si alguien pudiera mostrar la solución del problema descrito o proporcionar algún enlace útil para resolver el problema.
¡Gracias!
Respuestas:
Puedes ver esta respuesta . También puede usar un adaptador personalizado, pero la solución a continuación está bien para casos simples.
Aquí hay una nueva publicación:
Entonces, si viniste aquí porque quieres tener etiquetas y valores en el Spinner, así es como lo hice:
Spinner
forma habitualarray.xml
archivo: una matriz para etiquetas, una matriz para valoresSpinner
conandroid:entries="@array/labels"
Cuando necesite un valor, haga algo como esto (no, no tiene que encadenarlo):
fuente
Sé que el hilo es viejo, pero por si acaso ...
Objeto de usuario:
Adaptador giratorio personalizado (ArrayAdapter)
Y la implementación:
fuente
Skipped 317 frames! The application may be doing too much work on its main thread.
Alguna idea?La solución más simple
Después de buscar diferentes soluciones en SO, descubrí que la siguiente es la solución más simple y limpia para completar una aplicación
Spinner
personalizadaObjects
. Aquí está la implementación completa:User.java
res / layout / spinner.xml
res / layout / your_activity_view.xml
En su actividad
fuente
currentID
tan pronto como cambia el valor de Spinner . La mayoría de las veces solo necesita el valor del Spinner después de presionar posteriormente un botón, como Enviar o Guardar , no inmediatamente después de que el Spinner cambie y, si se puede evitar, esto proporciona una solución mucho más simple.getSelectedItem()
llamada en eso. Gracias por el consejo.Para soluciones simples, simplemente puede sobrescribir el "toString" en su objeto
y luego puedes usar:
De esta manera, su ruleta mostrará solo los nombres de usuario.
fuente
Con mucho, la forma más simple que he encontrado:
Ahora puede pegar cualquier objeto en su ruleta y mostrará la etiqueta especificada.
fuente
Solo un pequeño ajuste a la respuesta de Joaquín Alberto puede resolver el problema de estilo. Simplemente reemplace la función getDropDownView en el adaptador personalizado como se muestra a continuación,
fuente
Funciona bien para mí, el código necesario alrededor de getResource () es el siguiente:
¡Solo necesita asegurarse (por sí mismo) de que los valores en las dos matrices estén alineados correctamente!
fuente
inspirado por Joaquin Alberto, esto funcionó para mí:
fuente
Basado en el ejemplo de Joaquín Alberto (gracias), pero funciona para cualquier tipo (debe implementar toString () en tipo, para que pueda formatear la salida.
También creo que puede reemplazar List by Array, por lo que no necesita hacer toArray in List, pero tenía una List ..... :)
fuente
Para entender el truco, uno tiene que saber cómo funcionan los adaptadores en general y ArrayAdapter en particular.
Adaptadores: son objetos que pueden unir estructuras de datos a widgets, luego estos widgets muestran esos datos en una Lista o en un Spinner.
Entonces las dos preguntas que responde un Adaptador son:
EditText
del widget o la vista compuesta de acuerdo con estos datos?Las respuestas de ArrayAdapter son:
row.xml
ORandroid.R.layout.simple_spinner_item
) para cualquier índice es el mismo, y se infla desde el recurso cuya ID se le dio al constructor de ArrayAdapter..setText()
método del widget se utilizará con el formato de cadena del elemento en la estructura de datos de soporte. El formato de cadena se obtendrá invocando.toString()
el elemento.CustomListViewDemo.java
adaptor_content.xml
main.xml
Funciona correctamente, espero que sea útil.
fuente
Mi objeto personalizado es
También quería establecer este objeto como fuente de mi adaptador para mi spinner sin extender ArrayAdapter para que lo que hice fuera.
Ahora podrá ver los resultados en su ruleta, el truco consistía en anular
toString()
su objeto personalizado , por lo que cualquier valor que desee mostrar en la ruleta simplemente devuelva eso en este método.fuente
Creo que la mejor solución es la "Solución más simple" de Josh Pinter .
Esto funcionó para mí:
fuente
Si no necesita una clase separada, me refiero a un simple adaptador asignado a su objeto. Aquí está mi código basado en las funciones ArrayAdapter proporcionadas.
Y porque es posible que deba agregar un elemento después de la creación del adaptador (por ejemplo, carga asincrónica del elemento de la base de datos).
Simple pero eficiente.
Y luego puede usar este código (no pude poner Categoría [] en el constructor del adaptador porque los datos se cargan por separado).
Tenga en cuenta que adapter.addAll (items) actualiza el spinner llamando a notifyDataSetChanged () en interno.
fuente
Hacer:
fuente