Arquitectura de Software

1

Arquitectura en Android

2

Patr√≥n de dise√Īo vs. Arquitectura de Dise√Īo

3

¬ŅQu√© es la Arquitectura de Dise√Īo?

4

SOLID: Single Responsability y Open/Closed Principles

5

SOLID: Liskov substitution, Interface segregation y Dependency Inversion principle

6

Evolución de la Arquitectura en Android

Arquitectura Model View Controller (MVC)

7

¬ŅQu√© es la aquitectura Model View Controller (MVC)?

8

MVC en un Proyecto Android: Analizando el código en capas

9

MVC en un Proyecto Android: Llevando el código a sus responsabilidades

Arquitectura Model View Presenter (MVP)

10

¬ŅQu√© es la aquitectura Model View Presenter (MVP)?

11

¬ŅQu√© es Clean Architecture?

12

Composición en Clases

13

Model View Presenter explicado

14

Capa Model

15

MVP en un Proyecto Android: Presenters y Views

16

MVP en un Proyecto Android: Model

17

Ubicando el código en MVP

Arquitectura Model View ViewModel (MVVM)

18

¬ŅQu√© es la arquitectura Model View ViewModel (MVVM)?

19

¬ŅC√≥mo funciona MVVM Data Binding?

20

MVVM Data Binding estructurando nuestra aplicación y migrando a AndriodX

21

MVVM DataBinding creando un ViewModel

22

Patron Observer en MVVM

23

MVVM Data Binding: integrando ViewModel a View

24

MVVM Data Binding: RecyclerView Adapter

25

MVVM Data Binding: RecyclerView CardView

Android JetPack Arquitectura

26

¬ŅQu√© es Android JetPack Arquitectura?

27

¬ŅC√≥mo funciona la arquitectura de componentes?

28

Arquitectura Componentes Lifecycle ViewModel

29

Arquitectura Componentes Lifecycle Observe

Fin del curso

30

Conclusiones

No tienes acceso a esta clase

¬°Contin√ļa aprendiendo! √önete y comienza a potenciar tu carrera

Curso de Arquitectura de Android

Curso de Arquitectura de Android

Anahí Salgado Díaz de la Vega

Anahí Salgado Díaz de la Vega

MVVM Data Binding: RecyclerView CardView

25/30
Recursos

Para habilitar el plugin de Kotlin puedes escribir esta línea:

apply plugin: "kotlin-kapt"

Aportes 22

Preguntas 3

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

Me gusta cuando las cosas no le funcionan a @anncode porque es genial verla c√≥mo corrige. Siempre es muy √ļtil.

Que ejemplo tan denso, casi no se termina

Compa√Īeros para cumplir el reto colocar los siguiente

En el CouponViewModel

companion object{
        @JvmStatic
        @BindingAdapter("loadImage")
        fun loadImage(imageView: CircleImageView, imageUrl: String?){
            imageUrl?.let {
                if (it.isNotEmpty())
                    Picasso.get().load(it).into(imageView)
            }
        }
    }

y en el XML del card_coupon solo agregar en el view de circle Image lo siguiente:

app:loadImage="@{model.getCouponAt(position).image_url}"

Estimados, ahí les va mi aporte por si les paso.
Encontré un bug cuando desplazaba el recyclerView, esto en la función chunkWords en la clase Coupon.tk no se considero que tendría textos cortos.
La mejora que realice fue la siguiente.

private fun chunkWords(string: String, delimiter: Char, quantity: Int): String {
val words = string.split(delimiter)
var newString: String = ""
if(words.size>quantity){
for (i in 0…quantity){
newString += words.get(i) + " "
}
}else{
newString = string
}
return newString
}

Aqu√≠ mi repositorio chicos, para los que se perdieron en el c√≥digo ūüíö

La nueva sintaxis para agregar el plugin sería
id 'kotlin-kapt'

XML:

            <de.hdodenhof.circleimageview.CircleImageView
                android:id="@+id/imgCoupon"
                android:layout_width="90dp"
                android:layout_height="90dp"
	app:loadImage="@{viewModel.getCoupontAt(pos).image_url}"
               />

ViewModel:

companion object {
        @JvmStatic
        @BindingAdapter("loadImage")
        fun loadImage(imageView: CircleImageView, imageUrl: String?) {
            imageUrl?.let {
                if (it.isNotEmpty())
                    Picasso.get().load(it).into(imageView)
            }
        }
    }

Para Corregir Referencia sin resolver: BR (Android Studio)

Deben agregarse para solucionar este problema es en sus (aplicaciones o módulos) build.gradle:

apply plugin: "kotlin-kapt"

PERO CLARO Q IBA A PASAR! Lo dejamos asi hace 2 min atras en el MISMO VIDEO =o

Buenas tardes compa√Īeros, acabo de terminar la parte de MVVM, y tengo un par de dudas , espero alguien me ayude a aclararlas, la primera es para que me sirven las dos √ļltimas funciones que se agregaron al Adaptador? getItemViewType y getLayoutIdForPosition‚Ķ

Y la segunda es como implementar el onclick listener en mvvm, ya que al cambiar de arquitectura , la app perdio esa funcionalidad… Saludos desde Jalisco Mexico

Para mi es mejor usar el databinding para omitir el findById de resto usar MVP en jetpack hay varios recursos que se pueden usar

Hola, buenas tardes. Es que tengo un problema, no s√© porqu√© me da este error al llamar ‚ÄúcallCouponsApi‚ÄĚ

E/ERROR:: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $

Me podrían ayudar?

falto hacer lo mismo pero en el detalle del articulo, ademas de agregar el click a cada item

Por alguna razón no me abre la view de CouponDetailAvtivity, a alguien más le pasa?

Que pasa con estas librerías porque me marcó este error en el archivo DataBinderMapperImpl?
import com.anncode.offersandcoupons.databinding.ActivityMainBindingImpl;
^
symbol: class ActivityMainBindingImpl
location: package com.anncode.offersandcoupons.databinding

import com.anncode.offersandcoupons.databinding.CardCouponBindingImpl;
^
symbol: class CardCouponBindingImpl
location: package com.anncode.offersandcoupons.databinding

mport android.util.SparseArray;
import android.util.SparseIntArray;
import android.view.View;
import androidx.databinding.DataBinderMapper;
import androidx.databinding.DataBindingComponent;
import androidx.databinding.ViewDataBinding;
import com.anncode.offersandcoupons.databinding.ActivityMainBindingImpl;
import com.anncode.offersandcoupons.databinding.CardCouponBindingImpl;
import java.lang.IllegalArgumentException;
import java.lang.Integer;
import java.lang.Object;
import java.lang.Override;
import java.lang.RuntimeException;
import java.lang.String;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;```

Se podría optimizar un poco el código en CardCouponHolder de está manera.

 class CardCouponHolder(var binding: ViewDataBinding) : RecyclerView.ViewHolder(binding.root) {
        fun setDataCard(couponViewModel: CouponViewModel, position: Position){
            binding.setVariable(BR.model, couponViewModel)
            binding.setVariable(BR.position, position)
            binding.executePendingBindings()
        }
    }

ufff estaba aterrado de que despues de todo este trabajo mi app no corriera, pero funciono bien! B|

noda puede MALISAL!

"voy a estar atenta a refrescar los cambios, tambien" .. es bastante confuso, no se actualiza automaticamente?

cada vez que me invita a recordar algo anterior para explicar algo actual no puedo evitar pensar en spaghetti code

por que no corres el proyecto ann?? por que dejar ese cabo suelto??

Si no les aparece el foquito para usar el Convert to data binding layout, con Alt + Intro (estando en la etiqueta correspondiente) aparecen las opciones.