MVVM でアダプター モードを使用する Android についてのいくつかの考え


MVVM でアダプター モードを使用する Android についてのいくつかの考え



序文

人は常に学び続けることで進歩していくものであり、デザインパターンを学んだ後は常にそれをプロジェクトに活用して統合したくなるものですが、無理に使うと逆効果になるため、やはり適材適所で活用することが必要です。 . 正しい方法。この記事では、アダプター設計モードを使用して、異なるビューモデルを切り替えてフラグメント内の異なるデータを表示し、ビューページャー + フラグメントを置き換える効果を実現する方法を紹介します。


1. アダプターの設計パターンとは何ですか?

携帯電話の画面に次のリストを表示したい場合、Andorid を勉強した友人は、リストを表示するには recycleview を使用する必要があることを知っています。その後、アイテムを表示するための新しいレイアウトを作成し、今日のハイライトであるアダプター (アダプタ) を作成するには、recycleview に項目レイアウトを埋め込んで表示するアダプタを作成する必要があります。これにより、次のような効果が得られます。

ここに画像の説明を挿入
このとき、友達の中には笑う人もいますが、これがアダプターモードだなんて言わないですよね?では、そうします、これがアダプタモードです、アダプタを切り替えることで、異なるアイテムデータを表示することができます、その中で、recycleviewというアダプタがあり、今回作成したアダプタはrecycleviewに特化した実装です、そしてRecyclerViewです。私たちが継承したアダプターは
一般的な仕様であり、recycleview に適応するためにここにいることを伝えます。

より平たく言えば、あなたが仕事を探していて、上司に「Android 開発エンジニアと面接したい」と伝えるのと同じです。上司が適応者であり、あなたが
特定の適応者であり、Android 開発エンジニアが合意された人です。仕様

2.MVVMでアダプターモードを使用する

1. 理由

最初にお話しますが、デザインパターンを無理に使用しないでください。自分のスキルを誇示しているように見えます。

Gaodeの地図をフラグメントに入れて、動的に地図上のタブを切り替えて、地図上に表示されるデータを切り替えたいというご要望をいただきましたが、自分では書かずにコピーできるという仕事姿勢に合わせて、まだです 開いたとき、隣の事業グループの要件がどのように書かれているかを眺めていましたが、世界の隣の事業グループの深い悪意を感じました。まずその実装について話しましょう。画面上部にタブレイアウト、下部にタブレイアウトが表示されます。6 つのフラグメントモジュールからなるビューページャーであり、各フラグメントのマップロジックとレイアウトは同じです。唯一の違いは、表示データとフィルター項目が異なることです。は異なります。各断片のコードは驚くべきことに 3000 行以上に達しています。記事全体は、繰り返しのロジックと眠気を誘うコードでいっぱいです。30 分も読んだ後、とても眠くなりました。この表現を使用すると、頭が混乱しているとしか言えません。ドアに挟まれた。そこで、アダプターパターンを使用することを考えました。結局のところ、表示されるデータとフィルター項目が実際に異なるだけで、UI は似ていますが、1 つのレイアウトを使用できるのに、なぜ 6 つのレイアウトを使用する必要がありますか?

2. 実現する

使用するメソッドが決まったら設計段階ですが、プロジェクトは MVVM なので、ビューモデルはデータの処理であり、両者の違いはたまたまデータ層にあるため、最終的にビューモデルから始めることにしました。そこで新しいエンティティクラスを作成しました。

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

    var dataList : List<Any> = emptyList()

}

ここでの dataList は表示しようとしているデータですが、それぞれのデータ型が異なるため、特定のデータ型は宣言されず、代わりに Any が使用されます。
次に、次のように Android 開発エンジニアのポジションを定義します (ビューモデル インターフェイスを作成します)。

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)

}

この抽象的な viemodel では、入力パラメータに MapEntity が含まれていることがわかります。getMapData メソッドの入力パラメータを見てください。6 つのページ フィルタ項目すべてが含まれているため、これは少し多すぎるかもしれません。これはアダプタ モードでもあります。欠点がある

次に、「あなた」のようなビューモデルを作成します

class MapViewModel () : BaseViewModel(), IBaseMapViewModel {
    
    

IBaseMapViewModel にインターフェイスを実装し、各データ エンティティ クラスの表示を具体的に処理するこのような具体的なビジネス ビューモデルを合計 6 つ作成しました。

最後に、これらの特定のビューモデルを使用するにはどうすればよいでしょうか? フラグメントでは、最初に抽象ビューモデルを定義します。

    //地图viewmodel
    private lateinit var viewModel: IBaseMapViewModel

次に、タブレイアウト内のさまざまな位置をクリックして、さまざまなビューモデルを初期化します。

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

ここには落とし穴があります。それは、ビューモデルが再初期化されるたびに、observe を再初期化する必要があるということです。そうしないと、要求されたデータを取得できません。


アダプターパターンを使用するメリットとデメリットをまとめるとこんな感じ

アドバンテージ:

  • コード量を削減し、フラグメントのコード量を 3000 行以上から 1000 行以上に削減しました。
  • コードがより明確になり、基本的にビューモデルが切り替わったときのみ判断が可能になり、残りは実際のビジネスコードです
  • メンテナンスコストの削減 6 つのデータに基づいて新しいデータ表示を追加する場合は、ビューモデルと論理判断を追加するだけで済み、非常に便利です

欠点:

  • 追加の処理は別の場所で行う必要があり、コメントを書かないとその部分のコードは恐ろしいものになります(getMapDataの入力パラメータなど)
  • 要件に大きな変更がある場合、たとえば、異なるデータを異なる方法で表現する必要がある場合、大量の意味のないインターフェイスを破棄して書き換えたり、追加したりする必要があり、可読性と保守性が非常に悪くなります。

おすすめ

転載: blog.csdn.net/shop_and_sleep/article/details/128419440