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
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.
.