Android Data Binding + ListAdapter

Cómo decir adiós a la repetición lógica vinculante

Wilber Ccori huaman
Sep 7, 2018 · 4 min read
Resultado de imagen para Android Data Binding + ListAdapter

Data Binding es una biblioteca bastante poderosa que ignoré vergonzosamente la mayor parte de mi tiempo como desarrollador de Android (muy probablemente porque solía ser un poco contradictorio ). He estado leyendo mucho al respecto, y naturalmente tropecé con las publicaciones de blog de George Mount . El artículo que realmente me llamó la atención fue este sobre Data Binding en un RecyclerView:

Enlace de datos de Android: RecyclerViewReduce, Reutiliza, Rebindmedium.com

Ese fue el momento en que me di cuenta de cuán grande puede ser Data Binding, y como ListAdaptersoy un ávido usuario de , pensé que las cosas podrían mejorar aún más si lo agregara a la mezcla. Esta será una breve publicación de blog sobre cómo podemos sacar el máximo provecho de la vinculación de datos y ListAdapterpara reducir los estándares y simplemente hacer que nuestro código sea más simple y más bonito.

Empecemos

… pero primero, en caso de que no sepas lo que ListAdapteres:

RecyclerView.Adapterclase base para presentar los datos de la Lista en a RecyclerView, incluidas las diferencias de cálculo entre Listas en una cadena de fondo.

Es una base Adapterque se actualiza automáticamente (¡con animaciones gratuitas!) Cuando la lista cambia. Llamar notifyDataSetChanged()y sus amigos ahora son una cosa del pasado; todo lo que necesita ahora es llamar para submitList()pasar la lista actualizada. Si esto es nuevo para usted, podría ser una buena idea tomarse un tiempo y obtener más información al respecto; la documentación es bastante buena y podría ser realmente el único recurso que necesitará.

Ahora volvemos a lo importante.

La idea principal del blogpost que acabo de mencionar es cómo podemos crear un genérico ViewHolderque se pueda reutilizar Adapteren nuestra aplicación. Supone ViewHolderque solo se necesitará un único objeto de datos para el enlace (lo que definitivamente es una buena práctica de todos modos). Este objeto es el parámetro del bind()método, y todo lo que hacemos con él se establece como la variable de un ViewDataBindingque recibimos como un argumento de constructor. A través de un ingenioso truco de convención de nombres, podremos hacer que esto ViewHolderfuncione donde queramos (más sobre esto más adelante):

Sí, esta pequeña clase tiene el potencial de reemplazar la mayoría de las ViewHoldercosas que has escrito hasta ahora. El código original cumple nuestro propósito aquí, así que no cambiaremos nada. Si quieres entender esa executePendingBindings()línea, dirígete a la publicación original para obtener una gran explicación.

A continuación, podemos crear una base Adapterque tendrá la mayor parte de la plantilla repetitiva que necesitaremos para cualquiera Adapterque escribamos. Nuestro DataBindingAdapterserá un poco diferente aquí porque va a extender ListAdapter:

Eso es todo, una clase super simple, incluso más simple que el original gracias a ListAdapter. Hay una suposición importante que hacemos allí: el id de diseño utilizado por el Adapterpara inflar el diseño es el viewType, por lo que cualquier niño Adaptertendrá que anular getItemViewType()para indicar qué diseño debe inflarse. Esta suposición es otra buena práctica que incluso se refuerza en la documentación.

Considere usar los recursos de identificación para identificar de manera única los tipos de vista de elementos.

Ahora digamos que queremos mostrar una lista de libros. Dadas esas dos clases que acabamos de escribir, veamos cómo BooksAdapterse vería nuestro :

Gracias a nuestras clases base, lo único de lo que tendremos que preocuparnos cuando creamos un adaptador es escribir el DiffUtil.ItemCallbackrequerido por el ListAdaptere indicando el ID de diseño que queremos inflar a través del getItemViewType()método. Por supuesto, también necesitamos atención especial en nuestro archivo de diseño:

Lo importante aquí es que el nombre de la variable debe coincidir con el nombre que usemos en el DataBindingViewHolder - en este caso es item. El resto es código de unión de datos simple y estándar.

¿Qué pasa con los adaptadores con diferentes ViewHolders?

Bueno, me alegro de que hayas preguntado. Generalmente, lo único que tendremos que cambiar es cómo estamos implementando getItemViewType()en el Adapter, pero normalmente el DiffUtil.ItemCallbacktendrá que cambiar también.

Digamos que nuestra lista de libros tendrá secciones, que naturalmente estarán representadas por un archivo de diseño completamente diferente. Nos aseguraremos de que nuestro Bookmodelo y nuestro nuevo Sectionmodelo compartan una interfaz, digamos Listable, para que podamos tenerlos en la misma lista. Las clases selladas también serían una buena opción aquí, pero no nos metamos en eso.

Así es como BooksAdaptersería nuestro aspecto:

Y no hay nada especial cuando queremos usar este adaptador en una Activity, por ejemplo:

Lo que más me gusta de todo esto es que una vez que todo está configurado, crear otro Adapteres tan fácil como escribir cómo diferenciar los elementos en la lista (por lo que ListAdapterpuede hacer su trabajo) y qué diseños queremos inflar. Es una prueba repetitiva y parece que solo estamos escribiendo código que realmente importa.

Si eres como yo y no le has dado mucho amor a Data Bond, espero que lo que escribí aquí pueda cambiar eso un poco. La vinculación de datos es bastante impresionante, mi experiencia con el nuevo compilador ha sido excelente hasta ahora, y ha pasado un tiempo ahora que Data Binding y Architecture Components pueden pasar el tiempo juntos . ¡Espero que puedas aprovecharlo tanto como yo!

Para conocer mas tecnologias pueden seguirme en mis redes sociales:

Facebook: https://web.facebook.com/wilbeDEV/

facebook: https://web.facebook.com/TechManiako/

Grupo_facebook: https://web.facebook.com/groups/166091130742535/

YouTube: https://www.youtube.com/c/WILBERCCORIDEVELOPER

Blogs: https://www.techmaniako.com/ED/

GitHub: https://github.com/wilberCcoriHuman

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade