Algunas ideas sobre Android usando el modo de adaptador en MVVM


Algunas ideas sobre Android usando el modo de adaptador en MVVM



prefacio

Las personas siempre están progresando a través del aprendizaje continuo, después de aprender el patrón de diseño, siempre quieren usarlo en el proyecto e integrarlo, pero será contraproducente usarlo a la fuerza, por lo tanto, aún es necesario usarlo en el lugar correcto. .La manera correcta. Este artículo presentará cómo cambiar diferentes modelos de vista para mostrar diferentes datos en un fragmento a través del modo de diseño del adaptador, para lograr el efecto de reemplazar viewpager+fragment.


1. ¿Cuál es el patrón de diseño del adaptador?

Si queremos mostrar la siguiente lista en la pantalla del teléfono móvil, los amigos que han estudiado Andorid saben que mostrar una lista requiere el uso de recycleview, y luego crear un nuevo diseño para mostrar el elemento, y luego nuestro punto culminante de hoy, adaptador ( adaptador), necesitamos crear un adaptador Hablando del diseño del elemento llenado en recycleview y mostrado, y luego lograr el siguiente efecto.

inserte la descripción de la imagen aquí
En este momento, algunos amigos se reirán, no me dirás que este es el modo adaptador, ¿verdad? Entonces lo haré; sí, este es el modo de adaptador. Al cambiar diferentes adaptadores, puede mostrar diferentes datos de elementos. Entre ellos, recycleview es el adaptador, y el adaptador que creamos es la implementación de una adaptación específica para recycleview. Y RecyclerView. El adaptador que heredamos
es una especificación general que le dice a RecycleView que estamos aquí para adaptarnos.

En términos más simples, es equivalente a buscar trabajo y luego decirle al jefe que quiero entrevistar a un ingeniero de desarrollo de Android, el jefe
es el adaptado, usted es la adaptación específica y el ingeniero de desarrollo de Android es el acordado. especificación

2. Usar el modo de adaptador en MVVM

1. Motivo

Déjame hablar de eso primero, no fuerces el uso de patrones de diseño, porque parecerá que estás mostrando tus habilidades.

Recibí una solicitud para poner un mapa de Gaode en un fragmento, y luego cambiar dinámicamente las pestañas en el mapa, luego cambiar los datos que se muestran en el mapa. De acuerdo con la actitud de trabajo de poder copiar y nunca escribir solo, tengo todavía no Cuando lo abrí, estaba mirando cómo se escribieron los requisitos del grupo empresarial de al lado, y luego sentí la profunda malicia del grupo empresarial de al lado del mundo. Hablemos primero de su implementación. Hay un tablayout en la parte superior de la pantalla y un tablayout en la parte inferior. Es un visor con 6 módulos de fragmentos, y cada fragmento tiene la misma lógica de mapa y diseño. La única diferencia es que los datos de visualización son diferentes y los elementos de filtro son diferentes. Cada fragmento ha alcanzado la asombrosa cantidad de más de 3000 líneas de código. Todo el artículo está lleno de lógica repetitiva y código somnoliento. Tenía tanto sueño después de leerlo durante media hora. Usando esta redacción, solo puedo decir que mi cabeza fue atrapado por la puerta. Así que pensé en usar el patrón del adaptador. Después de todo, solo los datos mostrados y los elementos de filtro son realmente diferentes, y la interfaz de usuario es similar. ¿Por qué usar seis diseños cuando puede usar un diseño, verdad?

2. Date cuenta

Después de finalizar el método a usar, es la etapa de diseño. Debido a que el proyecto es MVVM, finalmente decidí comenzar con el modelo de vista, porque el modelo de vista es el procesamiento de datos, y la diferencia entre nosotros está en la capa de datos, así que creé una nueva clase de entidad.

class MapEntity {
    
    
    //区域编号
    var areaCode = ""
    //区域名称
    var areaNames = ""
    //纬度
    var latitude = ""
    //经度
    var longitude = ""
    //统计数量
    var mapCount = 0

    var dataList : List<Any> = emptyList()

}

La lista de datos aquí son los datos que voy a mostrar, pero debido a que cada tipo de datos es diferente, el tipo de datos específico no se declara, sino que se usa Cualquiera en su lugar.
Luego defina la posición de un ingeniero de desarrollo de Android; (cree una interfaz de modelo de vista), similar a la siguiente

interface IBaseMapViewModel {
    
    

    var getList: MutableLiveData<List<Any>>
        get() = MutableLiveData<List<Any>>()
        set(value) = TODO()

    var isEmpty: MutableLiveData<Boolean>
        get() = MutableLiveData()
        set(value) = TODO()
    var loading: MutableLiveData<Boolean>
        get() = MutableLiveData()
        set(value) = TODO()
        
    var hintString : String

    var type : Int

    var drawable : Int

    var drawableClick : Int

    fun getMapData(
        botRightLat: String,
        botRightLon: String,
        categoryNo: String,
        industryNo: String,
        thirdCategoryNo: String,
        keyWord: String,
        searchType: Int,
        topLeftLat: String,
        topLeftLon: String,
        context: Context,
        distance: String,
        mCenterLatLng: LatLng,
        employmentStatus: String,//用工状态
        proficiency: String, //专业职级 	熟练度(专业职级 1:高级工(大工) 2:中级工(中工) 3:初级工(小工))
        workYear: String, //工龄 1-3传1 3-5传2 5-10传3 10以上传4
        qualificationTypeNo: String,
        qualificationClassNo: String,
        teamNumber: String,
        businessType : String
    )

    //成都房建水泥工成都房建水… 2.2w/月
    fun getMarkerText(item: MapEntity):String

    //等12份工作
    fun getMarkerNum(item: MapEntity,isProvince:Boolean):String

    fun getUrlSetting( id:String,  type:Int,  modelType:String, userNo:String, context: Context)

}

Se puede ver que en este modelo de vista abstracto, nuestros parámetros de entrada incluyen MapEntity; mire los parámetros de entrada del método getMapData, que puede ser demasiado, porque incluye los seis elementos de filtro de página, que también es un modo de adaptador a defecto

Luego crea un viemodel como "tú"

class MapViewModel () : BaseViewModel(), IBaseMapViewModel {
    
    

Implemente la interfaz en IBaseMapViewModel y maneje específicamente la visualización de cada clase de entidad de datos. ¡He creado un total de seis modelos de vista comerciales específicos!

Finalmente, ¿cómo usar estos modelos de vista específicos? En el fragmento, primero defina el modelo de vista abstracto

    //地图viewmodel
    private lateinit var viewModel: IBaseMapViewModel

Luego haga clic en diferentes posiciones a través de tablayout para inicializar diferentes modelos de vista

 when (selectSecondTap) {
    
    
            xxxxType -> {
    
    
                viewModel = MapViewModel()
            }
           
           ......

Aquí hay un escollo: observar debe reiniciarse cada vez que se reinicializa el modelo de vista; de lo contrario, no obtendrá los datos solicitados.


Un resumen de las ventajas y desventajas de usar el patrón adaptador como este

ventaja:

  • Se redujo la cantidad de código, se redujo la cantidad de código del fragmento, de más de 3000 líneas a más de 1000 líneas
  • El código es más claro, básicamente solo cuando se cambia el modelo de vista se puede hacer un juicio, el resto son códigos comerciales reales
  • Reduzca los costos de mantenimiento.Si desea agregar una nueva visualización de datos sobre la base de los seis, solo necesita agregar un modelo de vista y un juicio lógico, lo cual es muy conveniente

defecto:

  • Es necesario realizar un procesamiento adicional en diferentes lugares. Si no escribe comentarios, ese fragmento de código se verá aterrador (como el parámetro de entrada de getMapData)
  • Si hay un gran cambio en los requisitos, por ejemplo, diferentes datos deben representarse de diferentes maneras, será necesario anular y reescribir o agregar muchas interfaces sin sentido, lo que hace que la legibilidad y la capacidad de mantenimiento sean muy deficientes.

Supongo que te gusta

Origin blog.csdn.net/shop_and_sleep/article/details/128419440
Recomendado
Clasificación