Foro de elhacker.net

Programación => Java => Mensaje iniciado por: TickTack en 12 Diciembre 2018, 12:39 pm



Título: Android - Control Spinner
Publicado por: TickTack en 12 Diciembre 2018, 12:39 pm
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


Título: Re: Android - Control Spinner
Publicado por: HardC0d3 en 28 Diciembre 2018, 22:34 pm
ArrayAdapter: https://developer.android.com/reference/android/widget/ArrayAdapter (https://developer.android.com/reference/android/widget/ArrayAdapter)

Spinner: https://developer.android.com/reference/android/widget/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.

Citar
Pero 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.


Título: Re: Android - Control Spinner
Publicado por: TickTack en 12 Febrero 2019, 14:20 pm
Hola HardC0d3,

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

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í:

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

Gracias y saludos


Título: Re: Android - Control Spinner
Publicado por: Serapis en 12 Febrero 2019, 17:22 pm
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'.


Título: Re: Android - Control Spinner
Publicado por: TickTack en 14 Febrero 2019, 16:07 pm
Hola NEBIRE,

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

Te estoy muy agradecido.


Gracias y saludos