0 votos
Hola Ramón. Espero que me puedas ayudar con estas dudas.

Ante todo gracias porque estoy llevando un curso de Android y tu libro Android 100% me está ayudando a complementar muchas cosas. Por otro lado, en mi curso he visto un ejemplo de adaptador para un RecyclerView. Tengo un layout de cardview donde está definida una imagen con un texto y aparte mi layout principal. Asimismo, tengo una clase Adaptador con una clase anidada static ViewHolder (cada uno con sus respectivas herencias). En la clase Adaptador tengo los métodos onCreateViewHolder(ViewGroup parent, int ViewType) , onBindViewHolder(ViewHolder holder, int position), getItemCount() y su constructor que recibe un ArrayList. Quisiera saber lo siguiente:

1) onCreateViewHolder se encarga de "inflar" el layout donde está mi layout cardview de acuerdo a los parámetros del layout principal (por medio de el parámetro parent)?

2) Cómo puede el Adaptador recibir los parámetros del padre (o layout principal) si lo único que le paso al constructor es un ArrayList?

3) Tengo esto dentro del método ViewHolder onCreateViewHolder (ViewGroup parent, int ViewType)

//tengo el inflate:

{ View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview, parent, false);

//Luego esta variable v se devuelve como parámetro del ViewHolder:

return new ViewHolder (v); }

//en el LayoutInflater está marcado como "false" el último parámetro. Entonces debo suponer que la variable v contiene una instancia View del layout cardview (debidamente adaptada a su parent)?. Y si fuera "true" entonces v contendría una instancia de los dos layouts juntos?

 

4) Qué es lo que devuelve exactamente el método .inflate()? Es una instancia de un View para que pueda ser controlado y sus métodos usados? (Algo comparable a un " View instanciaDelLayout = new View (layout.xml) " ?

5) En el ejemplo que tengo, ese último parámetro es false y aún así se muestra correctamente (el layout principal con sus tarjetas y dentro de sus tarjetas sus elementos). ¿A qué se debe eso? en el código no se añade manualmente con un AddView() o algo parecido. ¿Quién lo añade al principal entonces si es que no lo hace el inflate() ?

5) Tengo lo siguiente en el código del ViewHolder extends RecyclerView.ViewHolder

{ public ViewHolder (View itemView) { private ImageView miImagen; private TextView miTexto;

super(itemView);

miImagen = (ImageView) itemView.findViewById(R…..));

miTexto = (TextView) itemView.findViewById(R…..));

}}

//Y dentro del método onBindViewHolder(ViewHolder holder, int position)

{

ClaseArray array = miArrayList.get(position);

holder.miImagen.setImageResource(array.getFoto());

holder.miTexto.setText(array.getNombre());

}

//Entonces, el orden es el siguiente: PRIMERO: onCreateViewHolder toma el layout cardview, lo acomoda a su padre, lo junta y envía una instancia a ViewHolder. SEGUNDO: la clase static ViewHolder ASOCIA el View recibido (la instancia de los dos layout juntos) con sus elementos contenidos. Crea instancias de TextView, ImageView, etc. TERCERO: Finalmente onBindViewHolder los "sincroniza" con sus respectivos valores (textos, imágenes, etc). Está bien mi análisis?

 

6) Finalmente, cómo se realiza el inflado del layout cuando se usa el método (automático) setContentView dentro de onCreate? Se supone que cuando ASOCIAMOS instancias de TextView, ImageView, etc y luego les asignamos sus valores estamos haciendo lo mismo que el ViewHolder y el onBindViewHolder?

 

Espero que me puedas ayudar a aclarar esas dudas por favor. Estoy practicando para ser un buen desarrollador Android y quiero alguna vez poder saber tantas cosas sobre programación como tú. De antemano muchas gracias!
preguntado por Gricardov Ago 19, 2016 en Lenguajes de programación

1 Respuesta

0 votos
Muy interesante la pregunta, aunque son muchas cosas que requieren un tiempo. Voy a intentar resumirte y darte referencias de más contenido. Te respondo por puntos:

1) Se encarga de inflar las nuevas vistas. Tienes un ejemplo completo de cards en: https://developer.android.com/training/material/lists-cards.html?hl=en

2) Si lo estás haciendo como el ejemplo que te he pasado antes, al constructor le puedes pasar cualquier tipo de parámetro y cuantos quieras

3) Si fuera True, depende de como tengas la vista, posiblemente te aparezca repetidas la jerarquía de los layouts. Tienes información sobre esto en http://jarroba.com/inflate-en-android-inflar-y-adjuntar-views/

4) El método inflate() devuelve la View. Por lo que podrás utilizarla normalmente, aunque una vez pasada al return (en este caso seguramente la contengas en un ViewHolder) ya se ejecutará y pintará. Más información sobre inflate en: https://developer.android.com/reference/android/view/LayoutInflater.html#inflate(int, android.view.ViewGroup)

5A) El True sirve para pedir el adjuntado de la jerarquía de Views al contenedor, el False no lo hará. El código se añade en el return de la función.

5B) No te puedo responder del todo pues no he hecho un estudio completo del ciclo de vida de RecyclerView. Te puedo decir que OnCreateViewHolder instancia el layout y el ViewHolder; el OnVindViewHolder carga los datos a una posición especificada y guarda la referencia en el ViewHolder.

6) setContentView es solo para añadir las vistas al Activity, ya lo realiza por debajo Android. Con ViewHOlder y onBindViewHolder esperas al evento, que se lanza tras invocar al setContentView. Más infromación de setContentView en https://developer.android.com/reference/android/app/Activity.html#setContentView(android.view.View)

Espero que algo se haya aclarado.

Muchos ánimos con la programación Android, es muy divertida, ya verás que te encantará :)
respondido por Ramon [Admin] Sep 2, 2016