Epoxy
Epoxy ayuda a RecyclerView a implementar la carga de datos, la actualización de la interfaz de usuario y otra lógica de manera más eficiente a través de una forma declarativa y mejorar la eficiencia del desarrollo de escenas de lista.
https://github.com/airbnb/epoxy
Epoxy es una biblioteca de Android para construir pantallas complejas en un RecyclerView - airbnb / epoxy
Proceso de desarrollo
El proceso de uso básico de epoxi:
- Crear un archivo de diseño de celda
puede usar.xml
o.kt
crear la celda de diseño. Se recomienda XML, es más fácil de usar con el enlace de datos. - Genere EpoxyModel de acuerdo con la celda
, declare el archivo de diseño en package-info.java y kapt genera automáticamente el código EpoxyModel de acuerdo con xml para que lo use EpoxyRecyclerView - Crear EpoxyController
EpoxyController es equivalente al adaptador de RecyclerView, que se utiliza para vincular datos a la interfaz de usuario y definir eventos como OnClick - Utilice EpoxyController para
configurar EpoxyController en EpoxyRecyclerView para completar el registro de datos y mostrar la lista
A continuación, introduzca brevemente la implementación específica de cada paso. Por ejemplo, necesitamos cargar los siguientes datos en la lista:
data class Foo (
var title: String,
var bar: List<Bar>
)
data class Bar (
var body: String,
var time: String
)
0. gradle
apply plugin: 'kotlin-kapt' // 需要使用kapt
android {
dataBinding {
enabled = true // 使用databinding
}
}
kapt {
correctErrorTypes = true
}
dependencies {
implementation 'com.airbnb.android:epoxy:3.4.2'
kapt 'com.airbnb.android:epoxy-processor:3.4.2'
implementation 'com.airbnb.android:epoxy-databinding:3.4.2'
}
1. diseño de celda
list_cell_a.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
>
<data>
<variable
name="title"
type="String"
/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{title}"
android:textSize="24sp"
android:textStyle="bold"
tools:text="test"
/>
</LinearLayout>
</layout>
list_cell_b.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
>
<data>
<variable
name="body"
type="String"
/>
<variable
name="time"
type="String"
/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="8dp"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{body}"
android:textSize="20sp"
tools:text="test"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{time}"
android:textSize="18sp"
tools:text="test"
/>
</LinearLayout>
</layout>
2. package-info.java
@EpoxyDataBindingLayouts({
R.layout.list_cell_a,
R.layout.list_cell_b
})
package com.airbnb.epoxy.sample;
import com.airbnb.epoxy.EpoxyDataBindingLayouts;
Después de la compilación, generará EpoxyModels
código de acuerdo con el archivo de diseño , como ListCellABindingModel_
, ListCellBindingModel_
etc., para vincular datos
3. EpoxyController
Herede TypedEpoxyController
, reescriba buildmodels
y complete los datos de la interfaz de usuario de forma declarativa.
class FooBarController : TypedEpoxyController<Foo>() {
override fun buildModels(foo: Foo) {
ListCellABindingModel_()
.title(foo.title) // databinding
.id(modelCountBuiltSoFar)
.addTo(this)
foo.bar.forEach {
ListCellBindingModel_()
.body(it.body)
.time(it.time)
.id(modelCountBuiltSoFar)
.addTo(this)
}
}
}
- Elija diferentes clases base de acuerdo con la cantidad de parámetros de buildModels, como
Typed2EpoxyController
,Typed3EpoxyController
etc. title
,body
,time
Se define la disposición dedatabinding
id
Usado para distinguir diferentes tipos de Celdas, todos los EpoxyModels deben tener una identificación única
4. uso en RecyclerView
class FooBarFragment : Fragment() {
lateinit var binding: FragmentFooBarBinding //fragment的layout生成的daabinding
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_foo_bar, container, false)
return binding.root
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
val controller = FooBarController()
binding.recyclerView.adapter = controller.adapter
val data = Foo("title", listOf(Bar("str1","time1"),Bar("str2","time2")))
controller.setData(data)
})
}
Al configurar los datos en el controlador, los datos se mostrarán automáticamente en la lista
para resumir
A través de un ejemplo simple, puede sentir que Epoxy tiene los siguientes beneficios
- Evite el uso de ViewHolder, menos código
- A través de EpoxyController y EpoxyModel, llene los datos de forma declarativa en la interfaz de usuario de forma sencilla e intuitiva
- Después de cada actualización de datos, la interfaz de usuario se actualizará automáticamente con una diferencia mínima (similar a la función de paginación)
- Úselo con MvRx para lograr una interfaz de usuario de respuesta completa