Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Controles De Selección
Android dispone de diversos controles que nos permiten seleccionar una opción dentro de
una lista de posibilidades. Así, podremos utilizar por ejemplo listas desplegables (Spinner),
listas fijas (ListView), o tablas (GridView). Los controles de selección tienen un elemento
importante en común, los adaptadores.
Un adaptador representa algo así como una interfaz común al modelo de datos que existe
por detrás de todos los controles de selección. Dicho de otra forma, todos los controles de
selección accederán a los datos que contienen a través de un adaptador.
Además de proveer de datos a los controles visuales, el adaptador también será
responsable de generar a partir de estos datos las vistas específicas que se mostrarán
dentro del control de selección. Por ejemplo, si cada elemento de una lista estuviera
formado a su vez por una imagen y varias etiquetas, el responsable de generar y establecer
el contenido de todos estos «sub-elementos» a partir de los datos será el propio adaptador.
Android proporciona de serie varios tipos de adaptadores sencillos, aunque podemos
extender su funcionalidad fácilmente para adaptarlos a nuestras necesidades. Los más
comunes son los siguientes.
Adaptador Descripción
ArrayAdapter Esperará una matriz o una lista de objetos como entrada.
CursorAdapter Aceptará una instancia de cursor como entrada. Se utiliza para mapear
las columnas de un cursor abierto sobre una base de datos sobre los
diferentes elementos visuales contenidos en el control de selección.
SimpleAdapter Aceptará datos estáticos definidos en los recursos. Se utiliza para mapear
datos sobre los diferentes controles definidos en un fichero XML de
layout.
BaseAdapter Es una implementación genérica para los tres tipos de adaptadores y se
puede usar para ListView , Gridview o Spinners según nuestros
requisitos.
La manera de crear un adaptador de tipo ArrayAdapter para trabajar con un array genérico
de kotlin es la siguiente:
1. val datos = arrayOf("Elem1", "Elem2", "Elem3", "Elem4", "Elem5")
2.
3. var adaptador = ArrayAdapter(
4. this,
5. android.R.layout.simple_spinner_item,
6. datos
7. )
En Android, Spinner es una vista que permite al usuario seleccionar un valor de la lista de
valores. El control Spinner en Android se comportará igual que la lista desplegable en otros
lenguajes de programación.
En general, el control Spinner de Android proporcionarán una forma rápida de seleccionar
un elemento de la lista de valores y mostrará un menú desplegable con una lista de todos
los valores cuando hacemos clic o tocamos en él.
De forma predeterminada, el control Spinner de Android mostrará su valor seleccionado
actualmente y al usar el Adaptador podemos vincular los elementos al objeto Spinner.
A continuación, se muestra la representación gráfica del uso del control Spinner en
aplicaciones de Android.
Podemos llenar nuestro control Spinner con una lista de opciones definiendo un
ArrayAdapter en nuestro archivo de Actividad.
En general, el Adaptador extrae datos de fuentes como una matriz o base de datos y
convierte cada elemento en una vista de resultados y se coloca en la lista.
1. <Spinner android:id="@+id/spinner1"
2. android:layout_width="wrap_content"
3. android:layout_height="wrap_content"/>
Para completar el Spinner con la lista de valores, debemos especificar el Adaptador del
Spinner, como un ArrayAdapter en el archivo de actividad como se muestra a
continuación.
1. val datos = arrayOf("Elem1", "Elem2", "Elem3", "Elem4", "Elem5")
2.
3. var adaptador = ArrayAdapter(
4. this,
5. android.R.layout.simple_spinner_item,
6. datos
7. )
8. adaptador.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
9. spinner1.adapter=adaptador
1. spinner1.setOnItemSelectedListener(
2. object : AdapterView.OnItemSelectedListener {
3. override fun onItemSelected(
4. parent: AdapterView<*>,
5. v: android.view.View,
6. position: Int,
7. id: Long
8. ) {
9. Toast.makeText(
10. applicationContext,
11. "Seleccionado: " + parent.getItemAtPosition(position),
12. Toast.LENGTH_SHORT
13. ).show()
14. }
15.
16. override fun onNothingSelected(parent: AdapterView<*>) {
17. Toast.makeText(
18. applicationContext,
19. "Ningun Elemento Seleccionado: ",
20. Toast.LENGTH_SHORT
21. ).show()
22. }
23. })
A diferencia de ocasiones anteriores, para este evento definimos dos métodos, el primero
de ellos (onItemSelected) que será llamado cada vez que se selecciones una opción en la
lista desplegable, y el segundo (onNothingSelected) que se llamará cuando no haya
ninguna opción seleccionada (esto puede ocurrir por ejemplo si el adaptador no tiene
datos). Además, vemos cómo para recuperar el dato seleccionado utilizamos el método
getItemAtPosition() del parámetro AdapterView que recibimos en el evento.
Ejemplo del control Spinner en Android
El siguiente es el ejemplo de la definición de un control Spinner, un control TextView en
RelativeLayout para mostrar la lista de detalles del usuario en la aplicación de Android.
Código archivo activity_main.xml
1. package com.uaa.controlesseleccion
2.
3. import androidx.appcompat.app.AppCompatActivity
4. import android.os.Bundle
5. import android.widget.ArrayAdapter
6. import kotlinx.android.synthetic.main.spinner_control.*
7. import android.widget.AdapterView
8. import android.widget.Toast
9.
10. class MainActivity : AppCompatActivity() {
11.
12. override fun onCreate(savedInstanceState: Bundle?) {
13. super.onCreate(savedInstanceState)
14. setContentView(R.layout.spinner_control)
15.
16. val usuarios = arrayOf("Pepito", "Fulanito", "Perenganito", "Sutanito")
17.
18. var adaptador = ArrayAdapter(
19. this,
20. android.R.layout.simple_spinner_item,
21. usuarios
22. )
23. adaptador.setDropDownViewResource(android.R.layout.simple_spinner_dropdown
_item)
24. spinner1.adapter = adaptador
25.
26. spinner1.setOnItemSelectedListener(
27. object : AdapterView.OnItemSelectedListener {
28. override fun onItemSelected(
29. parent: AdapterView<*>,
30. v: android.view.View,
31. position: Int,
32. id: Long
33. ) {
34. Toast.makeText(
35. applicationContext,
36. "Selecciono el Usuario: " + parent.getItemAtPosition(posit
ion),
37. Toast.LENGTH_SHORT
38. ).show()
39. }
40.
41. override fun onNothingSelected(parent: AdapterView<*>) {
42. Toast.makeText(
43. applicationContext,
44. "Ningun Usuario Seleccionado: ",
45. Toast.LENGTH_SHORT
46. ).show()
47. }
48. })
49. }
50. }
Resultado de la Aplicación
ListView
Podemos llenar nuestro control ListView con una lista de opciones definiendo un
ArrayAdapter en nuestro archivo de Actividad.
En general, el Adaptador extrae datos de fuentes como una matriz o base de datos y
convierte cada elemento en una vista de resultados y se coloca en la lista.
1. <ListView
2. android:id="@+id/list1"
3. android:layout_width="match_parent"
4. android:layout_height="wrap_content" >
5. </ListView>
Para completar el ListView con la lista de valores, debemos especificar el Adaptador del
ListView, como un ArrayAdapter en el archivo de actividad como se muestra a
continuación.
1. val datos = arrayOf("Elem1", "Elem2", "Elem3", "Elem4","Elem5")
2.
3. var adaptador = ArrayAdapter(
4. this,
5. android.R.layout.simple_selectable_list_item,
6. datos
7. )
8.
9. list1.adapter=adaptador
1. list1.onItemClickListener=object:AdapterView.OnItemClickListener{
2. override fun onItemClick(parent: AdapterView<*>?, v: View?, position: Int, id
: Long) {
3. Toast.makeText(
4. applicationContext,
5. "Selecciono el Elemento: " + parent?.getItemAtPosition(position),
6. Toast.LENGTH_SHORT
7. ).show()
8. }
9. }
Método Descripción
getCount() Devolverá el número total de filas contadas en la vista de lista
getItem() Se utiliza para especificar los datos del objeto de cada fila.
getItemId() Devuelve la identificación de cada elemento de fila
getView() Se utiliza para devolver una instancia de vista que representa una sola fila en
el elemento ListView.
Este archivo se utiliza como modelo de datos para cada ítem del ListView
1. package com.uaa.controlesseleccion
2.
3. class ListItem {
4. var name:String
5. var designation:String
6. var location:String
7.
8. constructor(name: String,designation: String,location: String) {
9. this.name=name
10. this.designation=designation
11. this.location=location
12. }
13.
14. }
1. package com.uaa.controlesseleccion
2.
3. import android.content.Context
4. import android.widget.TextView
5. import android.view.ViewGroup
6. import android.view.LayoutInflater
7. import android.view.View
8. import android.widget.BaseAdapter
9.
10.
11. class CustomListAdapter(aContext: Context, private val listData: ArrayList<ListIte
m>) :
12. BaseAdapter() {
13. private val layoutInflater: LayoutInflater
14.
15. init {
16. layoutInflater = LayoutInflater.from(aContext)
17. }
18.
19. override fun getCount(): Int {
20. return listData.size
21. }
22.
23. override fun getItem(position: Int): Any {
24. return listData[position]
25. }
26.
27. override fun getItemId(position: Int): Long {
28. return position.toLong()
29. }
30.
31. override fun getView(position: Int, view: View?, vg: ViewGroup): View? {
32. var v = view
33. val holder: ViewHolder
34. if (v == null) {
35. v = layoutInflater.inflate(R.layout.list_row, null)
36. holder = ViewHolder()
37. holder.uName = v.findViewById(R.id.name)
38. holder.uDesignation = v.findViewById(R.id.designation)
39. holder.uLocation = v.findViewById(R.id.location)
40. v.setTag(holder)
41. } else {
42. holder = (v.getTag() as ViewHolder)
43. }
44. holder.uName!!.setText(listData[position].name)
45. holder.uDesignation!!.setText(listData[position].designation)
46. holder.uLocation!!.setText(listData[position].location)
47. return v
48. }
49.
50. internal class ViewHolder {
51. var uName: TextView? = null
52. var uDesignation: TextView? = null
53. var uLocation: TextView? = null
54. }
55. }
1. package com.uaa.myapplication
2.
3. import androidx.appcompat.app.AppCompatActivity
4. import android.os.Bundle
5. import android.view.View
6. import android.widget.AdapterView
7. import android.widget.Toast
8. import kotlinx.android.synthetic.main.activity_main.*
9.
10. class MainActivity : AppCompatActivity() {
11. override fun onCreate(savedInstanceState: Bundle?) {
12. super.onCreate(savedInstanceState)
13. setContentView(R.layout.activity_main)
14.
15. val userList = getListData()
16.
17.
18. user_list.adapter=CustomListAdapter(this, userList)
19. user_list.onItemClickListener=AdapterView.OnItemClickListener { a:AdapterV
iew<*>?, v: View?, position:Int, id:Long ->
20. val user = a?.getItemAtPosition(position) as ListItem
21. Toast.makeText(
22. this@MainActivity,
23. "Selected : " + user.name + ", " + user.location,
24. Toast.LENGTH_SHORT
25. ).show()
26. }
27. }
28.
29. private fun getListData(): ArrayList <ListItem> {
30. val results = ArrayList <ListItem>()
31. val user1 = ListItem("Pepito","Lider de Equipo","Area de Desarrollo")
32. results.add(user1)
33. val user2 = ListItem("Fulanito","Desarrollador Senior","Cubo de Desarrollo
")
34. results.add(user2)
35. val user3 = ListItem("Perenganito","Desarrollador Junior","Cubo de Desarro
llo")
36. results.add(user3)
37. val user4 = ListItem("Sutanito","Analista de Sistemas","Depatamento de Inf
ormaion")
38. results.add(user4)
39. return results
40. }
41.
42. }
Resultado de la Aplicación
GridView
Algunos de los atributos mas importantes del control GridView son los siguientes.
1. <GridView android:id="@+id/gridView1"
2. android:layout_width="match_parent"
3. android:layout_height="match_parent"
4. android:numColumns="auto_fit"
5. android:columnWidth="250px"
6. android:horizontalSpacing="5dp"
7. android:verticalSpacing="10dp"
8. android:stretchMode="columnWidth" />
Para completar el ListView con la lista de valores, debemos especificar el Adaptador del
GridView, como un ArrayAdapter en el archivo de actividad como se muestra a
continuación.
Método Descripción
getCount() Devolverá el número total de filas contadas en la vista de lista
getItem() Se utiliza para especificar los datos del objeto de cada fila.
getItemId() Devuelve la identificación de cada elemento de fila
getView() Se utiliza para devolver una instancia de vista que representa una sola fila en
el elemento ListView.
1. package com.uaa.myapplication
2.
3. import android.content.Context
4. import android.view.View
5. import android.view.ViewGroup
6. import android.widget.AbsListView
7. import android.widget.BaseAdapter
8. import android.widget.ImageView
9.
10. class ImageAdapter(private val mContext: Context) : BaseAdapter() {
11. //Creamos un ArrayList de Int con las Imagenes
12. var thumbImages = arrayOf<Int>(
13. R.drawable.img1,
14. R.drawable.img2,
15. R.drawable.img3,
16. R.drawable.img4,
17. R.drawable.img5,
18. R.drawable.img6,
19. R.drawable.img7,
20. R.drawable.img8,
21. R.drawable.img1,
22. R.drawable.img2,
23. R.drawable.img3,
24. R.drawable.img4,
25. R.drawable.img5,
26. R.drawable.img6,
27. R.drawable.img7,
28. R.drawable.img8,
29. R.drawable.img1,
30. R.drawable.img2,
31. R.drawable.img3,
32. R.drawable.img4,
33. R.drawable.img5,
34. R.drawable.img6,
35. R.drawable.img7,
36. R.drawable.img8
37. )
38.
39. override fun getCount(): Int {
40. return thumbImages.size
41. }
42.
43. override fun getItem(position: Int): Any? {
44. return null
45. }
46.
47. override fun getItemId(position: Int): Long {
48. return 0
49. }
50.
51. // Crea Un ImageView Para cada Item referenciado por el Adapter
52. override fun getView(position: Int, view: View?, vg: ViewGroup): View? {
53. val imageView = ImageView(mContext)
54. imageView.setLayoutParams(AbsListView.LayoutParams(200, 200))
55. imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)
56. imageView.setPadding(8, 8, 8, 8)
57. imageView.setImageResource(thumbImages[position])
58. return imageView
59. }
60. }
1. package com.uaa.myapplication
2.
3. import androidx.appcompat.app.AppCompatActivity
4. import android.os.Bundle
5. import android.view.View
6. import android.widget.Toast
7. import kotlinx.android.synthetic.main.activity_main.*
8. import android.widget.AdapterView
9.
10. class MainActivity : AppCompatActivity() {
11. override fun onCreate(savedInstanceState: Bundle?) {
12. super.onCreate(savedInstanceState)
13. setContentView(R.layout.activity_main)
14.
15. var adaptador = ImageAdapter(this)
16. gridView1.adapter = adaptador
17. gridView1.onItemClickListener =
18. AdapterView.OnItemClickListener { parent: AdapterView<*>, v: View, pos
ition: Int, id: Long ->
19. Toast.makeText(
20. this,
21. "Posicion de la Imagen: $position",
22. Toast.LENGTH_SHORT
23. ).show()
24. }
25. }
26. }
Resultado de la Aplicación
Referencias
1. https://developer.android.com/reference/android/widget/Adapter
2. https://developer.android.com/reference/android/widget/Spinner
3. https://developer.android.com/reference/android/widget/ListView
4. https://developer.android.com/reference/android/widget/GridView