[MÚSICA] [MÚSICA] Acabamos de crear una aplicación de contactos donde tenemos una lista con todos nuestros contactos, pero, ¿cómo podemos hacer más eficiente y sobre todo también más legible con los nuevos elementos de material design nuestra aplicación? Bien. Existe un nuevo elemento que se llama RecyclerView, RecyclerView es un nuevo elemento que se ha introducido en material design, es un nuevo widget, y es utilizado principalmente para manejar listas de datos. RecyclerView pretende sustituir por completo al famoso ListView. ¿Esto por qué? Porque RecyclerView como su nombre lo dice, Recycler de reciclaje, hará un reciclaje con todos tus items, es decir será mucho más eficiente. ¿Cómo ejecuta este reciclaje? Supongamos que tenemos una lista de unos 100 elementos, si estos 100 elementos los estamos mostrando en un ListView, bueno, todos los 100 elementos automáticamente se están cargando en la vista haciendo que de pronto esa pantalla de interfaz de usuario sea bastante pesada. Con RecyclerView, solamente como estamos viendo en esta pantalla, solamente estaremos cargando los datos que se ven en pantalla. Y para poder seguir viendo los datos anteriores, estaremos reciclando un layout, estaremos reciclando un item en particular. Imagina esta lista como un conjunto de renglones, cada renglón va a tener, si fuese una lista de contactos podrÃa tener una foto de nuestro contacto, podrÃa tener su nombre y a lo mejor un teléfono que sea directo para que nos de un preview de ese contacto. Si nosotros manejamos todo esto es un ListView, estaremos manejándolo sà en un layout pero en un layout que se estará repitiendo 100 veces, o dependiendo de la cantidad de elementos que tengas. Para un RecyclerView no tendremos los 100 elementos acumulados, sino que solamente tendremos en pantalla los 5 elementos que quepan, o los 10, o los 2 elementos que quepan y cuando el usuario haga scroll sobre la pantalla, en ese momento los elementos serán mostrados y además estará habiendo un reciclaje, reciclaje de elementos. De esta forma las interfaces no son tan pesadas en comparación de utilizar un ListView. Si utilizamos un RecyclerView estará reciclando nuestros layouts, estará reciclando nuestras vistas para hacer esto mucho más eficiente. Una de las ventajas también de utilizar RecyclerView, es que los elementos no solamente pueden ser mostrados en una lista, también pueden ser mostrados en forma de grid o de una forma escalonada utilizando un LayoutManager para cada uno de estos. Vamos a ver más adelante cómo podemos estar manejando un RecyclerView. La composición de un RecyclerView se puede ejemplificar con la siguiente figura. Primeramente tenemos un RecyclerView y un LayoutManager, este me va a ayudar precisamente a darle forma a mi lista, cómo es que quiero mostrar mi lista, si quiero mostrar los elementos en forma de grid, en forma escalonada o apilada o simplemente en una lista. Para eso utilizaré la clase auxiliar LayoutManager. Ahora, si hablamos sobre el adaptador, el adaptador podrÃa contener una clase anidada, es decir tendremos nuestra clase normal, nuestra clase adaptador para el caso de nuestra lista de contactos, tendrÃamos nuestra clase ContactoAdaptador. Esta clase ContactoAdaptador podrÃa tener una clase anidada que comúnmente es el nombre de la clase extensión ViewHolder. ViewHolder nos va a ayudar a manejar toda la conexión entre el adaptador y todos nuestros elementos views que componen el renglón de tu RecyclerView o el elemento que quieres mostrar en el RecyclerView, ViewHolder. Posteriormente tenemos nuestra clase adaptador. La clase adaptador que es una clase que está fuera de la clase anidada ViewHolder y esta clase adaptador va a ayudar a que podamos sincronizar todos los views que tenemos por un lado, los views de nuestro renglón con los datos obtenidos de cualquier lugar. Los datos puedes tenerlos en un Web Service o en una base de datos como you dijimos, pero básicamente aquà es donde estaremos manejando la lista de datos. Esta clase de adaptador contendrá tres métodos importantes. El primero, onCreateViewHolder, onCreateViewHolder como estamos observando aquÃ, se va a encargar precisamente de tomar ese layout, ese layout que define cada elemento de toda tu lista de RecyclerView, va a tomar el layout y lo va a sincronizar con nuestro ViewHolder, nuestra clase anidada que tenemos ahà mismo. El siguiente método onBindViewHolder, este método onBindViewHolder se va a encargar de setear o de colocar todos los datos de una lista o de una colección de datos que puedes traer en un elemento de tipo list o en un ArrayList o en un vector o lo que tú quieras, se va a encargar precisamente de tomar esa lista, setearla y además irla asociando a cada view de nuestro ViewHolder. Por último tenemos el método getItemCount, el método getItemCount lo único que nos va a devolver es el resultado de toda la cantidad de elementos que tenemos, es decir cuántos elementos estoy manejando en la lista. Para nuestro ejemplo nos devolverá la cantidad de contactos que estoy teniendo, esto para tener un mejor control sobre la lista y poder hacer su trabajo de reciclaje. Y por último tenemos Dataset, Dataset es precisamente el POJO que acabamos de crear. El POJO nos va a permitir manejar toda la interacción, si vas a traer los datos de un Web Service o si vas a traer los datos de una base de datos, etcétera, el POJO nos va a permitir manejar toda esta entidad de datos, para posteriormente comunicársela al adaptador y una vez que se tenga esa comunicación de adaptador, mostrarlo finalmente en un layout. Este es el gráfico, esta es la composición para lograr un RecyclerView. Si queremos ver esto a nivel de código, si queremos mostrar nuestros elementos en una lista, utilizaremos la clase LinearLayoutManager. Si queremos ver nuestros elementos en forma de grid, utilizaremos la clase GridLayoutManager. Y si queremos ver nuestros elementos de forma apilada, utilizaremos la clase StaggeredGridLayoutManager. Todo esto debe estar concentrando en el Activity donde vas a mostrar tu RecyclerView. PodrÃa ser en tu MainActivity y recuerda, todo va dentro de tu método onCreate. [MÚSICA]