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!