PDA

Ver la Versión Completa : [ CONSULTA ] Una mano para entender el código...


DevilKeeper
26/01/16, 12:01:29
Buenos días compañeros:

Soy nuevo en el foro, y nuevo en programación Android, y tengo algunas dudas que no sé como resolver, por lo que esperaba que me echárais una mano.

Estoy siguiendo un curso gratuito más o menos actualizado, y me he quedado atascado con el control RecyclerView. En el ejemplo de la página del curso aparece éste código:

public class AdaptadorTitulares
extends RecyclerView.Adapter<AdaptadorTitulares.TitularesViewHolder> {

//...

public static class TitularesViewHolder
extends RecyclerView.ViewHolder {

private TextView txtTitulo;
private TextView txtSubtitulo;

public TitularesViewHolder(View itemView) {
super(itemView);

txtTitulo = (TextView)itemView.findViewById(R.id.LblTitulo);
txtSubtitulo = (TextView)itemView.findViewById(R.id.LblSubTitulo) ;
}

public void bindTitular(Titular t) {
txtTitulo.setText(t.getTitulo());
txtSubtitulo.setText(t.getSubtitulo());
}
}

//...
}

Se supone que es la clase del Adaptador que necesita el RecyclerView, pero lo que no entiendo es lo señalado en rojo.

Sé lo que es extender una clase, pero no entiendo que significan los signos de menor que y mayor que.

¿La clase extiende de otra y a su vez de otra clase que se definde en su interior?.

A ver si alguién puede aclarármelo. Gracias.

Braaank
26/01/16, 12:06:32
Vale, entiendo lo que necesitas.
Lo que hay entre ese mayor que y menor que significa la clase que va a contener ese adaptador. Te pongo un ejemplo más sencillo con una clase de tipo ArrayList.

Cuando tú creas un ArrayList haces más o menos lo siguiente:
ArrayList<String> lista = new ArrayList<String>();

Lo que indica dentro de <> indica lo que vas a almacenar dentro de este objeto ArrayList.



Enviado desde mi iPad utilizando Tapatalk

DevilKeeper
26/01/16, 12:37:52
Muchas gracias por la respuesta.

Entonces son dos cosas separadas, el extends por un lado y la clase que contiene con menor y mayor que, por otro. Pensé que todo formaba parte del extends.

Pero no termino de encontrarle sentido. ¿Qué nombre recibe ésta práctica?. ¿Clase interna o algo así?

kriogeN
26/01/16, 14:16:53
Muchas gracias por la respuesta.

Entonces son dos cosas separadas, el extends por un lado y la clase que contiene con menor y mayor que, por otro. Pensé que todo formaba parte del extends.

Pero no termino de encontrarle sentido. ¿Qué nombre recibe ésta práctica?. ¿Clase interna o algo así?
Se llama tipo genérico. La clase base define un T. Y tú al usarla índicas que tipo va a contener realmente.

Enviado desde mi SM-G900F mediante Tapatalk

DevilKeeper
28/01/16, 17:56:15
Se llama tipo genérico. La clase base define un T. Y tú al usarla índicas que tipo va a contener realmente.

Enviado desde mi SM-G900F mediante Tapatalk

Gracias a los dos por las respuestas.

Este es un concepto que no he visto jamás, y me está costando entenderlo.
Con el ejemplo Braaank y el ArrayList lo veo enseguida, tengo un objeto ArrayList que va a contener Strings.

Pero al aplicarlo al RecycerView en Android, no me cuadra. Tengo una clase que extiende de RecyclerView.Adapter que... ¿que qué?, si entre <> estoy poniendo una clase que yo mismo he creado dentro...

No lo pillo...:(

mocelet
28/01/16, 18:09:09
Antes de los tipos genéricos se usaban parámetros de tipo Object para pasar instancias de clases arbitrarias, que era horrible porque por ejemplo una tabla hash cada vez que te devolvía un Object tenías que hacer un casting de tipos y el compilador tampoco podía comprobar si era lo que se pretendía o no.

La gracia de los <T> es precisamente poder meter una clase que ni siquiera existía porque la has hecho tú. Es una forma de decirle a Java que siempre vas a trabajar con ese tipo de clase. Aplicado a una tabla hash por ejemplo, sus métodos ya no devuelven Object sino el tipo que le hayas dicho al construir la tabla.

kriogeN
28/01/16, 18:56:42
Gracias a los dos por las respuestas.

Este es un concepto que no he visto jamás, y me está costando entenderlo.
Con el ejemplo Braaank y el ArrayList lo veo enseguida, tengo un objeto ArrayList que va a contener Strings.

Pero al aplicarlo al RecycerView en Android, no me cuadra. Tengo una clase que extiende de RecyclerView.Adapter que... ¿que qué?, si entre <> estoy poniendo una clase que yo mismo he creado dentro...

No lo pillo...:(

Le estás diciendo al RecyclerView.Adapter que los ViewHolder que va a contener son de tipo TitularesViewHolder. Porque RecyclerView.Adapter se define como: RecyclerView.Adapter<T extends ViewHolder>.

De esa manera ocurrirá lo que dice mocelet, los tipos en tu clase serán TitularesViewHolder, en lugar de ViewHolder, y así te evitas tener que castear de ViewHolder a TitularesViewHolder, que es el tipo real que estás introduciendo en el Adapter.

DevilKeeper
29/01/16, 19:15:20
Le estás diciendo al RecyclerView.Adapter que los ViewHolder que va a contener son de tipo TitularesViewHolder. Porque RecyclerView.Adapter se define como: RecyclerView.Adapter<T extends ViewHolder>.

De esa manera ocurrirá lo que dice mocelet, los tipos en tu clase serán TitularesViewHolder, en lugar de ViewHolder, y así te evitas tener que castear de ViewHolder a TitularesViewHolder, que es el tipo real que estás introduciendo en el Adapter.

Gracias a todos, ya me ha quedado mas claro.

Entonces, si en lugar de definir mi clase TitularesViewHolder dentro de la clase Adaptador, lo definiera en otra clase a parte... ¿Sería lo mismo, funcionaría igual?.

De verdad, gracias por vuestro tiempo.

mocelet
29/01/16, 19:34:12
Mientras extienda ViewHolder, sin problema