[Android] Use Epoxy en lugar de RecyclerView.Adapter

Inserte la descripción de la imagen aquí

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:

  1. Crear un archivo de diseño de celda
    puede usar .xmlo .ktcrear la celda de diseño. Se recomienda XML, es más fácil de usar con el enlace de datos.
  2. 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
  3. 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
  4. 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á EpoxyModelscódigo de acuerdo con el archivo de diseño , como ListCellABindingModel_, ListCellBindingModel_etc., para vincular datos


3. EpoxyController


Herede TypedEpoxyController, reescriba buildmodelsy 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, Typed3EpoxyControlleretc.
  • title, body, timeSe define la disposición dedatabinding
  • idUsado 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

  1. Evite el uso de ViewHolder, menos código
  2. A través de EpoxyController y EpoxyModel, llene los datos de forma declarativa en la interfaz de usuario de forma sencilla e intuitiva
  3. 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)
  4. Úselo con MvRx para lograr una interfaz de usuario de respuesta completa

Supongo que te gusta

Origin blog.csdn.net/vitaviva/article/details/108966907
Recomendado
Clasificación