Android - Control Spinner

Iniciado por TickTack, 12 Diciembre 2018, 12:39 PM

0 Miembros y 1 Visitante están viendo este tema.

TickTack

Hola a todos,

tengo una duda:

En la clase ArrayAdapter <String> se requieren en el constructor tres parametros. En el
primero hay que pasarle un objeto (normalmente la clase actual). Luego el adaptador
hay que pasarselo al metodo setAdapter de la clase Spinner. Pero necesita este metodo el
primer parametro que es pasado al constructor de la clase ArrayAdapter <String>? Por
qué?

Y por qué no hicieron los programadores la posibilidad de pasar los parametros al
metodo setAdapter directamente en vez de tener que crear un adaptador? No es eso poco
eficiente?


Gracias y saludos
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."

HardC0d3

ArrayAdapter: https://developer.android.com/reference/android/widget/ArrayAdapter

Spinner: https://developer.android.com/reference/android/widget/Spinner

El primer parámetro que pide el constructor de la clase ArrayAdapter es un objeto de la clase Context.
La firma del método setAdapter de la clase Spinner es: setAdapter(SpinnerAdapter adapter), por lo tanto, pide que se le pase un objeto de la clase/interfaz SpinnerAdapter.

CitarPero necesita este metodo el primer parametro que es pasado al constructor de la clase ArrayAdapter <String>?
Por qué?

setAdapter no pide un objeto Context ("primer parámetro del contructor de la clase ArrayAdapter"), sino que pide un objeto de la clase/interfaz SpinnerAdapter o cualquier subclase de ésta.

Porque si un método pide un objeto, es mejor construir ese objeto antes de pasárselo como parámetro a un método. Así, ese objeto puedes usarlo posteriormente con otros métodos que pidan Adapter en vez de estar construyendo el objeto dentro de un método de Spinner, ya que la función de Spinner no es crear Adapter sino obtener la "información" del objeto Adapter, entre otras cosas.

Saludos.

TickTack

Hola HardC0d3,

gracias por tu respuesta. Dejame, por favor, mostrarte el siguiente código:

String []opciones={"sumar","restar","multiplicar","dividir"};
ArrayAdapter <String>adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, opciones); spinner1.setAdapter(adapter);


¿Por qué hay que pasarle al constructor de ArratAdapter<String> uns referencia de la clase actual?
¿Por que no hicieron los programadores que en el método setAdapter se han pasados los tres parámetros? Es decir, así:

String []opciones={"sumar","restar","multiplicar","dividir"};
spinner1.setAdapter(this,android.R.layout.simple_spinner_item, opciones);


Gracias y saludos
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."

Serapis

Porque rompe uno de los objetivos/pilares de la programación orientada a objetos: La encapsulación.

La idea en la OOP es que se creen objetos abstractos, cada objeto hace su tarea y nada más. Cuanto más abstracto sea un objeto más genérico y por tanto más reutilizable resulta (encaja en más diferentes sitios que si está muy especializado).

Si un objeto debe tratar los métodos de otro objeto, entonces estará haciendo su tarea y parte de la que se supone que se encarga otro objeto.

Con tu ejemplo: al recibir tu 'spinner' un objeto arrayadapter, se supone que dicho objeto ya ha validado los parámetros que recibió al crearse la instancia 'adapter', así 'spinner', se desentiende de tener que tratar si dichos parámetros son válidos o no, la única verificación que precisaría, es saber que dicha instancia existe, los parámetros que luego tome de 'adapter', ya son seguro tomarlos y operar con ellos (con la garantía (se supone) de ser correctos).

Además la encapsulación, si te das cuenta simplifica mejor los parámetros, ya que 'adapter' atrapa todos los parámetros que al caso precisa 'spinner'.

TickTack

Hola NEBIRE,

¡¡lo has explicado de una manera tan maravillosa!!

Te estoy muy agradecido.


Gracias y saludos
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."