Android Arsenal – Ver adaptadores

OneAdapter está diseñado para simplificar y mejorar el uso del adaptador RecyclerView al tiempo que evita errores comunes. Con más módulos y ganchos, ya no tiene que pensar en escribir un adaptador y centrarse solo en lo que importa.

Para comprender mejor qué me llevó a escribir esta biblioteca y qué casos uso mejor, consulte mi publicación promedio: https://medium.com/@idanatsmon/adapting-your-recyclerview- the-2019-focus-e47edf2fc4f3 [19659003Característicasfinancieras:[19659004×Enfoquesmodularesaprobadosfutileuresetable

  • soporte para DiffUtil (usando Diffable)
  • Rendimiento optimizado – procesamiento interno realizado en un hilo de fondo
  • 100% escrito en Kotlin [1965900] :
  • Ganchos de eventos:
  •   dependencias {
    implementación   " com.ironsource.aura.oneadapter: oneadapter:   $ { LATEST_VERSION } " 
    } 

    Ejemplo

    proyecto de ejemplo que incluye el uso básico y avanzado tanto en Java como en Kotlin.

    Capturas de pantalla

    Uso básico

    1. Implementar módulo de elemento

    Los módulos de objeto se utilizan para la creación y asociación de todos los ViewHolders. En el método onBind, recibirá como parámetro el modelo asociado con esta vista y una clase ViewBinder que le permite encontrar (y almacenar en caché) las vistas definidas en el archivo de diseño asociado.

    Clase Java
        MessageModule    extiende    ItemModule < MessageModel >  {
     @NotNull    @Override 
            public    ItemModuleConfig    supplyModuleConfig  () {
     return    nuevo    ItemModuleConfig  () {
     @Override 
                    public    int    withLayoutResource  () { return    R .  diseño .  mensaje_mel; }
    };
    }
    
     @Override 
            public    void    onBind  ( @NotNull    MessageModel    modelo  @NotNull    viewBinder ) {
     TextView  título  =  viewBinder .  findViewById ( R .  id .  título );
    . Título    setText (modelo    título);
    }
    
     @Override 
            public    nulo    onUnbind  ( @NotNull    ViewBinder    viewBinder ) {
      //  rompe la lógica de cómo interrumpir la animación, liberar recursos para la visualización web, etc. 
    }
    } 
    Kotlin
      clase    MessageModule  :    ItemModule  < MessageModel > () {
     anular    diversión    suministro ModuleConfig  ()  =    objeto  :    ItemModuleConfig  () {
     anular    diversión    con LayoutResource  ()  =    R  .layout.message_model
    }
    
     anular    diversión    onBind  ( modelo :    MessageModel   viewBinder :    ViewBinder 
     val  título  =  viewBinder.findViewById < TextView > ( R  .id.title)
    title.text  =  model.title
    }
    
     anular    diversión    onUnbind  ( viewBinder :    ViewBinder ) {
      //  rompe la lógica de cómo interrumpir la animación, liberar recursos para la visualización web, etc. 
    }
    } 

    2. Implementar Diffable

    El adaptador está calculando la diferencia entre sus datos actuales y modificados en un hilo de fondo y está publicando el resultado en el hilo principal. Para que esta magia funcione sin escribir toneladas de DiffUtil.Callback, sus modelos deben implementar una interfaz simple:

    Java
      public    clase    MessageModel    implementa    Diffable  {
     privado    int  id;
     título privado    String ;
    
     @Override 
          público    largo    getUniqueIdentifier  () {
     return  id;
    }
    
     @Override 
          public    boolean    areContentTheSame  ( @NonNull    Objeto    otro ) {
     return  otra  instancia de    MessageModel    &&  título .  es igual a (([[] MessageModel ) otro] .  título);
    }
    } 
    Kotlin
      clase    MessageModel  :    Diffable  {
     privado    val  id :    Int    =    0 
          privado    val  título :    ¿Cadena? [19659024] =    nulo 
    
          anular    diversión    getUniqueIdentifier  () :    Long    =  id.toLong ()
     anular    diversión    areContentTheSame  ( otro :    Cualquiera ) :    Booleano  ] [194590015]] 19659026] MessageModel    &&  title  ==  other.title
    } 

    3. Adjunte a OneAdapter y use

    Java
      OneAdapter  oneAdapter  =    nuevo    OneAdapter  ()
    .attachItemModule ( nuevo [19659028] MessageModule  ())
    .attachTo (recyclerView);
    
    oneAdapter .  setItems ( ... ) 
    Kotlin
      val  oneAdapter  =    OneAdapter  ()
    .attachItemModule ( MessageModule  ())
    .attachTo (recyclerView);
    
    oneAdapter.setItems (...) 

    Uso avanzado

    Tipos múltiples

    ¿Tiene más de un tipo de vista? no es un problema, simplemente cree otro ItemModule y conéctelo a OneAdapter de la misma manera.

    1. Implemente más módulos de artículos

      clase    MessageModule    extiende    ItemModule < MessageModel >  { ... }
     clase    StoryModule    se extiende    ItemModule < StoryModel >  { ... } 

    2. Adjuntar a OneAdapter

      OneAdapter  oneAdapter  =    nuevo    OneAdapter  ()
    .attachItemModule ( nuevo [19659028] MessageModule  ())
    .attachItemModule ( nuevo [19659028] StoryModule  ())
     ... 

    Módulo de paginación

    El módulo de paginación se utiliza para crear y asociar un ViewHolder específico al final de la lista cuando el adaptador alcanza un estado superior. La configuración del umbral visible se utiliza para indicar cuántos elementos antes del final de la lista se debe llamar a la devolución de llamada onLoadMore.

    1. Implementar módulos de paginación

    Java
      clase    PagingModuleImpl    extiende    PagingModule  {
     @NotNull    @Override 
          public    PagingModuleConfig    supplyModuleConfig  () {
     return    nuevo    PagingModuleConfig  () {
     @Override 
                  public    int    withLayoutResource  () { return    R .  diseño .  load_more; }   //  puede ser una animación de carga. 
    
                  @Override 
                  public    int    conVisibleThreshold  () { return    3 ; }   //  invoca onLoadMore 3 elementos antes del final. 
    };
    }
    
     @Override 
          público    nulo    onLoadMore  ( int    currentPage ) {
      //  ingrese aquí su carga más lógica, como pedirle al ViewModel que cargue la siguiente página de datos. 
    }
    } 
    Kotlin
      clase    PagingModuleImpl  :    PagingModule  () {
     anular    diversión    suministro ModuleConfig  ()  =    objeto  :    PagingModuleConfig  () {
     anular    diversión    con LayoutResource  ()  =    R  .layout.load_more   //  puede ser un poco de animación spinner 
              19659024] diversión    conVisibleThreshold  ()  =    3    //  invocar onLoadMore 3 elementos antes del final 
    }
    
     anular    diversión    onLoadMore  ( currentPage :    Int ) {
      //  ingrese aquí su carga más lógica, como pedirle al ViewModel que cargue la siguiente página de datos. 
    }
    } 

    2. Adjuntar a OneAdapter

    Java
      OneAdapter  oneAdapter  =    nuevo    OneAdapter  ()
    .attachPagingModule ( nuevo [19659028] PagingModuleImpl  ())
     ...  
    Kotlin
      val  oneAdapter  =    OneAdapter  ()
    .attachPagingModule ( PagingModuleImpl  ())
    ... 

    Módulo de vacío

    El módulo de vacío se utiliza para crear y asociar un ViewHolder específico cuando el adaptador no tiene datos para representar.

    1. Implementación de módulos de vacío

    Java
      clase    EmptinessModuleImpl    extiende    EmptinessModule  {
     @NotNull    @Override 
          public    EmptinessModuleConfig    supplyModuleConfig  () {
     return    new    EmptinessModuleConfig  () {
     @Override 
                  public    int    withLayoutResource  () { return    R .  diseño .  empty_state; }
    };
    }
    
     @Override 
          público    nulo    onBind  ( @NotNull    ViewBinder    viewBinder ) {[194590015]}
    
     @Override 
          public    nulo    onUnbind  ( @NotNull    ViewBinder    viewBinder ) {]}}
    } 
    Kotlin
      clase    EmptinessModuleImpl  :    EmptinessModule  () {
     anular    diversión    suministro ModuleConfig  () :    EmptinessModuleConfig    =    objeto  :    EmptinessModule {19659024]
     anular    diversión    con LayoutResource  ()  =    R  .layout.empty_state
    }
    
     anular    diversión    onBind  ( viewBinder :    ViewBinder ) {...}
    
     anular    diversión    onUnbind  ( viewBinder :    ViewBinder ) {...}
    } 

    2. Adjuntar a OneAdapter

    Java
      OneAdapter  oneAdapter  =    nuevo    OneAdapter  ()
    .attachEmptinessModule ( nuevo [19659028] EmptinessModuleImpl  ())
     ...  
    Kotlin
      val  oneAdapter  =    OneAdapter  ()
    .attachEmptinessModule ( EmptinessModuleImpl  ())
    ... 

    Formulario de selección

    El formulario de selección se utiliza para habilitar la selección única o múltiple en elementos.

    1. Implementar módulos de selección

    Java
      clase    ItemSelectionModuleImpl    extiende    ItemSelectionModule  {
     @NotNull    @Override 
          public    ItemSelectionModuleConfig    supplyModuleConfig  () {
     return    nuevo    ItemSelectionModuleConfig  () {
     @NotNull    @Override 
                  public    SelectionType    withSelectionType  () { return    SelectionType . ] [1945929]}   //  O SelectionType.Single. 
    };
    }
    
     @Override 
          público    nulo    onSelectionUpdated  ( int    selectedCount ) {
      //  ingrese aquí su lógica de selección general, cómo cambiar el texto de la barra de herramientas para indicar el recuento seleccionado. 
    }
    } 
    Kotlin
      clase    ItemSelectionModuleImpl  :    ItemSelectionModule  () {
     anular    diversión    suministro ModuleConfig  () :    ItemSelectionModuleConfig    =    objeto  :       
     anular    diversión    conSelectionType  ()  =    SelectionType .  Múltiple    //  O SelectionType.Sle]
    }
    
     anular    diversión    onSelectionUpdated  ( selectedCount :    Int ) {
      //  ingrese aquí su lógica de selección general, cómo cambiar el texto de la barra de herramientas para indicar el recuento seleccionado. 
    }
    } 

    2. Implementar estado de selección

    Java
      clase    SelectionStateImpl    extiende    SelectionState < MessageModel >  {
     @Override 
          public    boolean    selectionEnabled  ( @NonNull    MessageModel    modelo ) {
     return    verdadero ;
    }
    
     @Override 
          público    nulo    onSelected  ( @NonNull    MessageModel    modelo  boolean    seleccionado {
      //  actualiza tu plantilla aquí. 
      //  inmediatamente después de esta llamada, recibirá una llamada onBind para reflejar sus cambios en el Formulario de artículo correspondiente. 
    modelo .   =  seleccionado está seleccionado;
    }
    } 
    Kotlin
      clase    SelectionStateImpl  :    SelectionState  < MessageModel > () {
     anulación    diversión    selectionEnabled  ( modelo :    MessageModel )  =    verdadero 
    
          anulación   ] ( modelo :    MessageModel   seleccionado :    booleano ) {
      //  actualiza tu plantilla aquí. 
      //  inmediatamente después de esta llamada, recibirá una llamada onBind para reflejar sus cambios en el Formulario de artículo correspondiente. 
    model.isSelected  =  seleccionado;
    }
    } 

    3. Adjuntar a ItemModule y OneAdapter

    Java
      OneAdapter  oneAdapter  =    nuevo    OneAdapter  ()
    .attachItemModule ( nuevo [19659028] MessageModule  ()) .  addState ( nuevo [19659028] SelectionStateImpl  ())
    .attachItemSelectionModule ( nuevo [19659028] ItemSelectionModuleImpl  ())
     ...  
    Kotlin
      val  oneAdapter  =    OneAdapter  ()
    .attachItemModule ( MessageModule  ()). addState ( SelectionStateImpl  ())
    .attachItemSelectionModule ( ItemSelectionModuleImpl  ())
    ... 

    Click Event Hook

    Los módulos de objetos se pueden mejorar fácilmente con ganchos de eventos como ClickEventHook que le permiten asociar un detector de clics para toda la vista.

    1. Implementa el enlace de evento Click

    Java
      clase    MessageClickEvent    extiende    ClickEventHook < MessageModel >  {
     @Override 
          público    nulo    onClick  ( @NonNull    MessageModel    modelo  @NonNull    viewBinder ) {
      //  ingrese su lógica de clic aquí. 
    }
    } 
    Kotlin
      clase    MessageClickEvent  :    ClickEventHook  < MessageModel > () {
     anular    diversión    onClick  ( modelo :    MessageModel   viewBinder :    ViewBinder 
    // ingrese su lógica de clic aquí. } }

    2. Adjuntar a ItemModule

    Java
      OneAdapter  oneAdapter  =    nuevo    OneAdapter  ()
    .attachItemModule ( nuevo [19659028] MessageModule  ()) .  addEventHook ( nuevo [19659028] MessageClickEvent  ())
     ...  
    Kotlin
      val  oneAdapter  =    OneAdapter  ()
    .attachItemModule ( MessageModule  ()). addEventHook ( MessageClickEvent  ())
    ... 

    Copyright (c) 2019 Idan Atsmon

    La autorización se otorga, de forma gratuita, a cualquier persona que obtenga una copia de este software y los archivos de documentación asociados (el "Software"), para tratar el Software sin ninguna limitación, incluidos, entre otros, los derechos de uso, copia, modificación, fusión, publicación, distribución, licencia y / o venta de copias del Software y para permitir que las personas a quienes se les proporciona el Software lo hagan, sujeto a las siguientes condiciones:

    El aviso de copyright anterior y este aviso de autorización deben incluirse en todas las copias sustanciales o partes del Software.

    EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN NINGÚN TIPO DE GARANTÍAS, EXPRESAS O IMPLÍCITAS, INCLUIDAS, PERO SIN LIMITARSE, A LAS GARANTÍAS DE COMERCIABILIDAD, APTITUD PARA UN PROPÓSITO EN PARTICULAR Y SIN INFRACCIÓN. EN NINGÚN CASO, LOS AUTORES O LOS TITULARES DE LOS DERECHOS DE AUTOR SERÁN RESPONSABLES DE NINGÚN RECLAMO, DAÑO U OTRA RESPONSABILIDAD, EN CASO DE CONTRATO, TORT O CUALQUIER OTRO TIPO, DERIVADO DE, FUERA DE, O EN RELACIÓN CON EL SOFTWARE O EL USO U OTRAS OFERTAS SOFTWARE.

    .

    Compruebe también

    en vivo desde Droidcon, incluida la mayor actualización de Gemini en Android Studio y más lanzamientos del SDK de Android.

    Acabamos de lanzar nuestro episodio de otoño de #TheAndroidShow en YouTube etcétera desarrollador.android.comy esta vez …

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *