[MUSIC] Ok, pues precisamente vamos a hacer eso. Vamos a llevarnos estos métodos, vamos a llevarlos a nuestra interfaz. Y entonces primeramente voy a estar definiendo por aquà mi método public void. Primeramente vamos a poner generarLinearLayoutVertical. Recuerda que en este método vamos a estar implementando todo lo que tenemos por acá. La parte que nuestro recycler view se ha mostrado en un linear layout y además en forma vertical. Vamos a tener un segundo método, que este método también va hacer público. Y lo que nos va a devolver este método va hacer un contacto adaptador, un adaptador de contacto, y se va a llamar crear crearAdaptador, le vamos a poner que va a recibir a partir de una lista de contactos. Lo que hará este método es generarnos un adaptador. Básicamente este método hará lo que nosotros tenemos por aquÃ. Esta lÃnea que está aquà recibe la lista de contactos y nos genera un adaptador. Nuestro siguiente y último método que tendremos en esta interfaz será inicializar adaptador del Recycler View. En este método vamos a estar recibiendo nuestro adaptador, ContactoAdaptador, y estaremos devolviendo aquà vamos a colocar un void. Y entonces lo que nosotros estaremos haciendo será precisamente pasando el adaptador, ésta lÃnea de código que esta aquÃ, pasándole el adaptador al Recycler View. Muy bien. you tengo listo aquà mi interfaz. Si observas está viviendo en el mismo package del fragment del controlador. Y entonces vamos a empezar a trabajar con esos códigos. Lo primero que tengo que hacer es ahora aquà en mi RecyclerViewFragment, tengo que implementar la interfaz que acabo de crear. Entonces vamos a poner implements IRecyclerViewFragment. Y si quisieras hacerlo también generar un modelo vista presentador, también lo tendrÃas que hacer para el caso de perfil fragment o para el caso de otra actividad. Para cada entidad que estamos manejando tenemos que estar generando un modelo vista presentador propio. Entonces voy a darle aquà un alt enter que me va a pedir que implemente los métodos. Le voy a decir que esos tres métodos los implemente. Y entonces me dice, primero, generarLinearLayoutVertical, muy bien. Básicamente ésto que tengo aquÃ, lo voy a cortar y lo implementaré aquà en mi método, generarLinearLayoutVertical. Bien, ahora, para el adaptador, básicamente lo que tengo aquà lo vamos a cortar y lo vamos a poner por acá. Simplemente ahora ésto pues va a desaparecer porque ahora lo vamos a poner aquÃ. Y entonces este método you se puede ir yendo. TodavÃa nos falta una lÃnea, vamos a dejarlo tantito ahÃ. Y este adaptador es lo que vamos a estar devolviendo. Perfecto. Ahora nos falta éste, inicializarAdaptador. InicializarAdpatador será exactamente lo que dice en esta lÃnea, vamos a cortarla y la pegamos aquÃ. Ahora sà podemos llevarnos, podemos quitar esta lÃnea. Vamos a quitar esta lÃnea que está acá, también ésto que tenemos por aquÃ, you no lo necesitamos. Y listo, con que tenga por el momento estas dos lÃneas, es decir mi RecyclerView declarado y tenga yo por aquà este devolviendo el view inflado, con eso es suficiente. Vamos a ver qué está pasando, nos está marcando un error. El error que nos está marcando es precisamente porque como añadimos a nustro POJO, a nuestro contacto en el método constructor, el atributo de likes pues nos está solicitando una cantidad. Entonces este métodos por el momento lo vamos a comentar, puesto que en algún momento de nuestra aplicación lo vamos a estar necesitando. Entonces hasta aquà es todo lo que necesitamos. Hemos creado, tan sólo la vista. La primera parte del modelo vista presentador, tan sólo hemos creado la vista para RecyclerViewFragment. Éste es su ViewModel. Ahora vamos a crear el presentador. Para ésto vamos a crear un nuevo Package y le vamos a poner presentador. En este Package van a a estar concentrados todos los presentadores de nuestro proyecto. Entonces lo primero, este presentador se va a componer de dos elementos. El primero, una interfaz donde voy a tener como aquà también lo tengo, como lo acabo de hacer, donde voy a tener definidos todos los métodos de mi presentador. El objetivo del presentador es únicamente estar noficando y únicamente estar fungiendo como un intermediario entre todas las acciones de la vista. Y en este caso, para este ejercicio, y todas las acciones de la base de datos. Entonces el presentador nos va a ayudar a que la capa de base de datos se mantenga o la capa de datos se mantenga aislada de la vista. Es decir que los datos no estén aquà en este archivo, sino que estén aislados. Para que de esta forma si mi base de datos, si hoy está manejando una base de datos, bueno, esa capa está aislada. Pero si mañana esos datos los estoy manejando a través de un webservice, gracias a que esa capa está aislada yo de una forma muy sencilla puedo estar cambiando la fuente de datos. Entonces vamos a crear aquà en el presentador una interfaz donde vamos a tener definidos los métodos clave que me van a ayudar a estar manejando la interacción con la base de datos. Que básicamente será nuestro método obtener contactos de la base de datos. Recuerda que ahora nuestros contactos you no van a estar hardcodeados, o you no van a ser datos dummy, sino los datos los vamos a traer aquà de una tabla. Y además, una vez obtenidos los datos, tenemos que mostrarlos en un RecyclerView. Entonces eso va a tener definido mi interfaz y necesitaré además una clase que tenga implementada esa interfaz, donde en esa clase pues voy a estar definiendo lo que va a hacer cada método. Entonces aquà en el presentador vamos a crear primeramente nuestra interfaz. Recuerda que este ejemplo lo estoy haciendo únicamente para RecyclerViewFragment. Vamos a seleccionar aquà interfaz. Y vamos a escribir iRecyclerViewFragmentPresenter. Ésta será nuestra interfaz. Vamos a colocar public void. Nuestro primer método es obtenerContactosBaseDatos. Este métodos podrÃa llamarse de una forma más general, a lo mejor obtener contactos, asà de forma general. Pero en este caso le estamos llamando de la base de datos. Le vamos a poner otro que sea mostrar contactos en un recycler view. Muy bien, you tengo definidos mis métodos, ahora vamos a crear nuestra clase. Nuestra clase se va a llamar, sin la i,solamente recyclerViewFragmentPresenter. Básicamente el mismo nombre de la interfaz pero sin la i. Entonces lo que haremos aquà será implementar la interfaz que acabamos de crear. IRecyclerViewFragment. Vamos a implementar los métodos que nos está solicitando. Y le decimos que sÃ, que los implemente esos tres, perfecto. Y además necesitaremos por aquÃ, un constructor. Voy a dar comand n. Por aquà se nos escondió la ventana pero aquà está. Vamos a darle un command n, y vamos a decirle que un constructor. Un constructor que va a estar recibiendo una instancia de la interfaz que acabamos de hacer para la parte del modelo. Una instancia del modelo. IRecyclerViewFragment. Y también el contexto, que es un objeto que necesitamos la mayorÃa del tiempo para estar mostrando mensajes o para estar pasando contextos entre las actividades. Entonces aquà arriba voy a declarar. Voy a hacer esto un poco más grande para que se vea mejor. Voy a declarar precisamente pues estos dos objetos. De forma global, para que cuando yo esté instanciando pueda pasarle los datos y pueda estar inicializando las variables de una forma completa. Entonces vamos a colocar private IRecyclerView, asÃ. Y también un private para mi contexto. Context, listo. Punto y coma. Vamos a poner aquà this.iRecyclerView = iRecyclerView. Y acá la misma, compara context. Punto y coma. Muy bien. Entonces vamos a manejar esta parte de generarLinearLayoutVertical. Y aquà yo me he equivocado, he implementado los métodos del view, en realidad deben ser los métodos del presentador. Entonces Vamos a quitar estos métodos. Deben ser los métodos de la interfaz presentador, la que corresponde a ésta, a la clase. Entonces vamos a quitar éste. IRecyclerViewPResenter, éste es el que buscamos. Entonces implementamos nuestros métodos. Listo. Entonces obtener contactos de la base de datos. Aquà está y también mostrar contactos en un RecyclerView. Ok, entonces estos métodos todavÃa no los voy a estar implementando, todavÃa no. Puesto que, todavÃa no tengo listo mi modelo de base de datos, todavÃa no tengo lista aquella clase que va a estar trabajando para estar conectándose a la base de datos y bueno, para estar trabajando con los datos en general. Entonces lo primero que haré es precisamente trabajar ahora el modelo. Entonces voy a dejar estos métodos por aquÃ, asà simplemente sobrescritos, todavÃa no los voy a implementar. Y vamos a generar un nuevo package, le vamos a dar db. Y en ese Package db va a estar toda la lógica de la base de datos. Entonces lo primero que voy a crear aquà va a ser una clase. Una clase que le voy a llamar mi constructor de contactos. Esta clase todo el tiempo va a esta ayudándome a construir los diferentes contactos que necesite en ese momento, o las diferentes vistas de contactos que necesite en ese momento. Entonces aquà no tenemos que implementar nada. Esta clase que tenemos por aquÃ, en algunas fuentes le llaman el interactor. Que es como una clase intermedia que está interactuando o está sirviendo de intermediario y con la clase que directamente consulta la base de datos. Entonces, esta clase que está aquà es mi clase clave. Esta clase es la clase clave para poder estar switcheando en algún momento dado la fuente de datos, si en un momento es la base de datos, y en otro momento es un webservice. Yo necesito declarar por aquà estándares. Entonces antes de comenzar con mis estándares voy a declarar un constructor. Y voy a colocar un contexto. Un contexto. Y el contexto lo voy a estar pasando también a través de este constructor. Me trae contacto en vez de contexto. Ahà está, contexto. Listo. Hacemos nuestro this, this.context. Igual a context. Ok, perfecto. This.context igual a context. Entonces el primer método que voy a trabajar aquÃ, va a ser el método obtener los datos. Entonces mi primer estándar es que no importa de dónde yo obtenga los datos. Siempre los datos deben venir en un array list, siempre deben venir en un arreglo, en un array list, una colección de objetos contacto. Entonces voy a definir mi método obtener datos, pero este método debe devolver un array list de contactos. Vamos a poner obtenerDatos, asÃ, listo. Entonces yo aquÃ, pues todavÃa no vamos a manejar la conexión de la base de datos. Entonces podrÃamos hacer, como a manera de ejemplo, los datos dummy que tenÃamos en nuestro RecyclerView que habÃamos comentado. Tenemos acá está en el RecyclerViewFragment, estos que están aquà que decÃa inicializar datos. Entonces esto es lo que a mà me sirve, es lo que a mà me funciona para construir un RecyclerView. Y entonces lo puedo poner como datos dummy por el momento. Entonces puedo aquà estar manejando mi ArrayList de contactos. Y simplemente hacer un return de contactos, punto y coma. Listo. Aquà me dice que algo sucede con drawable y ahorita revisamos. Necesitamos poner los likes. Únicamente pues vamos a poner unos likes a manera de, recuerda que son datos dummy. Este va a tener cinco, este va a tener tres, este va a tener ocho, este va a tener nueve. Listo. Vamos a hacer un rebuild, que se vuelva a construir el proyecto para que pues esta R you no aparezca asà roja. Aquà me dice que el recurso no existe. Vamos a ver donde está. R.drawable. Y sÃ, en efecto no nos está reconociendo R. Lo que haremos será comentar esto, asÃ, y de nuevo hacer un rebuild. A veces sucede que se nos ensucia un poco nuestro archivo R y eso es muy peligroso. Entonces tratamos de primero comentamos los errores para que cuando compile no compile con errores. Y después entonces you procedemos a hacer la inserción R.drawable. Punto. Y el que tenÃamos aquà era candy_icon, ahà está. Listo. Entonces vamos a ver si los demás you. you está, perfecto. Ahà está, recuerda que son datos dummy, por aquà vamos a quitar esto que tenÃamos para comentar. Listo, esto es lo que va a hacer obtenerDatos. Ahora, vamos a donde estábamos por acá. Entonces hasta el momento pues va a decir aquà obtener contactos de la base de datos. Y entonces pues vamos a hacerle creer que los contactos que está obteniendo son efectivamente de la base de datos. Pero bueno, sabemos nosotros que estos pues son datos dummy. Entonces para hacer esto vamos a generar un objeto de nuestro constructor. Entonces ese objetito de constructor lo vamos a poner global arriba. Y vamos a poner private constructorContactos. Y aquà vamos a poner constructorContactos aquà lo vamos a instanciar, igual a new ConstructorContactos. Nos va a estar solicitando el contexto, aquà está, es el contexto que estamos recibiendo por aquÃ. Y vamos a hacer constructorContactos.obtenerDatos. Esto obtenerDatos va a estar devolviéndonos un ArrayList, ¿recuerdas? Un ArrayList de contacto. Entonces yo necesito pues estar almacenando estos contactos en un ArrayList. Entonces vamos a declarar por aquà mi ArrayList de contactos. Y ahorita vas a ver para qué lo necesitamos. Entonces contactos, vamos a ponerle aquà contactos se inicialice con lo que traiga mi constructor de contactos. Aquà pareciera que está muy rebuscado. Pero en realidad esta es la parte donde separamos la fuente de los datos con la presentación de los datos. Entonces esto simplemente me va a ayudar a poder presentar los datos de una forma más sencilla. Entonces voy a implementar mi método mostrarContactos. Y lo voy a mostrar a través de mi objeto iRecyclerViewFragmentView, que lo tengo por ahÃ. Le voy a decir .inicializarAdaptador. Aquà lo que estoy haciendo es, recuerda que tenemos que mostrar los contactos en el RecyclerView. Primeramente necesitamos inicializar el adaptador. Y para inicializar el adaptador necesito crear un adaptador. El adaptador se crea a partir de un ArrayList contactos. Entonces lo que yo tendrÃa que hacer para que esto tuviera secuencia es este método estarlo llamando después de que los datos dummy se hayan traÃdo. Entonces lo que sucede es que primero los datos dummy se rellenan, se rellena el ArrayList de contactos. Se asigna aquà a este objeto global, a esta colección de lista global, se asigna aquÃ. Y llamamos este método que estará inicializando nuestro RecyclerView. Y entonces aquà para crear el adaptador recibe la lista que previamente you se llenó acá. Crea nuestro adaptador y finalmente el adaptador se lo pasa a inicializar adaptador. Que contiene pues toda la parte de asignar los datos al RecyclerView. Entonces inicializarAdaptador, recuerdas acá lo tenemos en RecylcerView, aquà está, inicializarAdaptador. Aquà dice setAdapter, se lo pone al RecyclerView directamente. Perfecto. you hemos colocado, you hemos terminado con nuestro presentador. Y entonces únicamente nos faltarÃa terminar nuestra capa de datos, nuestro modelo. Entonces recapitulando, hemos hecho a partir de este fragment que tenÃamos en modelo mvc, lo hemos transformado ahora a un view model. Con ayuda de una interfaz hemos definido todos los métodos, los hemos separado, los hemos definido en la interfaz. Y hemos creado un presentador que todo gira en torno de esta clase. Entonces un presentador donde estamos definiendo dos métodos clave, obtener contactos de la base de datos y mostrar los contactos de la base de datos. Estos métodos los estamos implementando en una clase que creamos, que tiene un nombre parecido, un nombre similar. Se llama fragmentPresenter. RecyclerViewFragmentPresenter. Y ahà estamos definiendo los datos que básicamente lo que está haciendo es extraer los datos de alguna fuente y mostrarlos en nuestro RecyclerView. Entonces hasta ahorita hemos hecho ViewModel y presentador. Hemos hecho una conexión de una fuente de datos X. En este caso nuestra fuente de datos es una fuente de datos dummy. Y entonces estamos mostrando los de datos en un presentador. Si nosotros corremos nuestra aplicación, podrÃamos ver you tan solo los datos dummy. Vamos a correrlos, está compilando. Y bueno, en este momento todavÃa no estamos viendo nada porque en nuestra clase RecyclerViewFragment, en nuestro método onCreateView, pues en ningún momento estamos mandando llamar nuestro presentador. Vamos a declarar un presentador, private. Y vamos a decir IRecyclerView. Necesita tener una instancia de la interfaz RecyclerViewFragmentPresenter. Y le vamos a decir presenter. Y aquà en presenter vamos a instanciarlo con la clase RecyclerViewPresenter. Donde le vamos a estar pasando this, el RecyclerViewFragmentView y el contexto. Vamos a decir aquà getContext. Ahora sÃ, con esta instancia que you está colocada en el método onCreateView, automáticamente todo lo que está definido en el presentador. Si hacemos como un retroceso lo que sucede es que empieza a construirse el objeto presentador a partir de aquÃ. Entonces se reciben estos datos automáticamente si ejecuta el método obtener contactos de la base de datos. Entonces empieza a actuar nuestro constructor de contactos. Nuestro constructor de contactos va a una fuente de datos y obtiene los datos, nos los trae en un arreglo. Y entonces con nuestro método mostrar contactos del RecyclerView estamos insertando los datos en el RecyclerView. Entonces todo va como en cadenita. Vamos a correr esto de nuevo y aquà esperamos ver you nuestro RecyclerView. Ahorita no hemos definido la fuente de datos, la fuente de datos es una fuente de datos dummy. A continuación vamos a estar recibiendo la fuente de datos. Bien, entonces vamos a ver qué sucede. Y claro, parece ser que necesitamos aquà nuestro presentador. Llamar al método obtener contactos de la base de datos. Lo corremos de nuevo, vamos otra vez. Parece ser que también nos faltó algo más. Es muy bueno estar debuggeando de esta forma para estar previniendo errores en un futuro. Y lo que nos falta también por acá es estar definiendo en nuestro método mostrarContactos de qué forma queremos ver el RecyclerView. Si no hacemos esto pues nuestro RecyclerView no se va a mostrar, por eso no lo estamos mostrando. Entonces vamos a poner IRecyclerView y vamos a poner por aquà generar un RecyclerView con un LinearLayoutVertical. Y sÃ, por eso es que no estamos viendo nuestro RecyclerView. Porque no le hemos colocado de qué forma queremos mostrarlo. Entonces vamos a correr nuestro proyecto. Aquà está. Y está tronando, vamos a ver qué pasó. Y por aquà nos está lanzando un null pointer exception, dice que no se puede invocar TextView porque el objeto trae un valor nulo como referencia. Vamos a ver quién nos está trayendo un valor nulo como referencia, que lo que está referenciando aquà viene nulo. Vamos a ver nuestra clase anidada, aquà está ContactoViewHolder. TvLikes y ok. Entonces lo que está pasando es que, aquà en vez de tvTeléfono deberÃa ser tvLikes. Vamos a guardarlo y vamos a correr esto de nuevo. Entonces en ningún momento tvLikes se estaba instanciando. Y entonces por eso estábamos almacenando una referencia nula. Y entonces you no deberÃamos tener ningún problema, deberÃamos you ver nuestra lista de contactos de nuestros datos dummy. Vamos a ver. Y listo, aquà están you nuestros contactos. Perfecto, están nuestros contactos dummy. Si revisamos en contraste de lo que creamos de los datos dummy, aquà está, tenemos Anahà Salgado que tiene cinco likes. Aquà está, estos datos que pusimos aquà son los mismos que estamos viendo por acá. Si accesamos a alguno de los elementos pues todos los elementos funcionan. Se está mostrando el teléfono, el correo electrónico de cada elemento. El botón de like también funciona respectivamente para cada contacto. Perfecto. Entonces con esto you tenemos aislada la capa de los datos. you tenemos implementado nuestro modelo vista presentador. Lo único que nos faltarÃa ahora será configurar toda la parte de nuestra base de datos. Entonces eso lo veremos en nuestro siguiente video. [MUSIC]