基於Google MVVM框架的baseMVVM框架

前提說明:

本人在項目中的一些總結和參考大佬的代碼,綜合了一個小型的Android vvm框架 本框架適用於中小項目,而且對DataBinging有必定的瞭解。mvvm模式對數據展現累項目的開發十分友好。項目大或者頁面邏輯複雜的項目請繞行MVP 項目地址:gitHub地址 https://github.com/dingdaidao/baseMVVMjava

主要特性:

1.加入retrofit2 RxJava 2.使用GoogleArch大禮包,包含 LiveData ,ViewModel,LifeCycle 3.提供 DataBinding 自定義綁定事件(TextView,ImageView,) 4.集成張旭童的一行代碼實現RecyclerView 簡書連接 5.基於RxJava的 RxBus,RxUtilsandroid

如何使用:

1.activity,xml,和viewModel該怎麼寫

繼承Commonlib下的BaseActivity,並傳入DataBinding生成的xml對應的ViewDataBing類和該頁面的ViewModel類git

public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewModel> {
複製代碼

注意ActivityMainBinding該類是根據activity_main.xml的命名來生成的。咱們先來看下activity_main.xml文件github

<!--跟佈局用layout包裹-->
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools">
    <!--聲明xml對應的ViewModel類-->
    <data>

        <variable name="mainVM" type="com.example.ding.vm.MainViewModel" />
    </data>
    <!--rootview-->
    <android.support.constraint.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">
        <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{mainVM.weatherLiveData}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" />
    </android.support.constraint.ConstraintLayout>
</layout>
複製代碼
@Override
   protected void dealWithAction(Event event) {
      //處理rxbus訂閱的信息
   }
複製代碼
@Override
   public int initContentView() {
      return R.layout.activity_main;
   }
@Override
   public int initVariableId() {
      return BR.mainVM;
   }
複製代碼

initContentView方法是爲了獲取該頁面的xml,intiVariableId是獲取xml對應綁定的ViewModel(MainViewMode)的idapp

@Override
   public MainViewModel initViewModel() {
      return new MainViewModel();
   }
複製代碼

initViewModel是爲了獲取對應viewModel的實例框架

@Override
    public void initViewObservable() {

    }
複製代碼

initViewObservable是爲了初始化viewModel層產生數據變化時的監聽事件,好比viewModel中一個天氣狀況的數據weatherLiveData產生了變化,則weatherLiveData.observe(this,(params){ //處理數據變化 });通常來講咱們會把數據經過dataBinding直接塞給xml,View層,但也不排除其餘複雜一點的操做,在xml中沒法處理。因此,能夠在initViewObservable中初始化LiveData的監聽事件。咱們再來看下ViewModel類mvvm

public class MainViewModel extends BaseViewModel {
    private MutableLiveData<String> weatherLiveData = new MutableLiveData<>();

    @Override
    public void onCreate() {
        super.onCreate();
        //頁面初始化的一些操做
    }

    public MutableLiveData<String> getWeatherLiveData() {
        return weatherLiveData;
    }
    /** * 可不寫此方法 * 使用getShowTxt.setValue(String weatherLiveData) * * @param weatherLiveData */
    public void setWeatherLiveData(String weatherLiveData) {
        this.weatherLiveData.setValue(weatherLiveData);
    }
}
複製代碼

在ViewModel類中定義的weatherLiveData屬性是繼承自LiveData,這是LiveData的介紹Android Developer LiveData。LiveData能夠個DataBinding連用,實現雙向綁定,數據驅動模型。在view層中綁定LiveData,在LiveData中的數據產生變化時,LiveData經過Observe通知到DataBinding綁定的控件,更新顯示數據。或者,view產生變化的時候,view綁定的LiveData也會更着頁面更新。ide

2.RecycleView的實現

recyclerView的實現參考了張旭童大神的方法,上連接簡書連接先看下item中xml的實現:佈局

<data>
        <variable
            name="data"
            type="String" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{data}" />
    </LinearLayout>
複製代碼

定義傳入數據的類型String和對應name data(此爲固定,由於已經在item.xml中定義了通用id:data,這樣在代碼中配置adapter的時候就不用傳該item的variableId了)。this

BaseBindingAdapter mAdapter=new BaseBindingAdapter(this,R.layout.main_item);
        mBinding.r.setAdapter(mAdapter);
複製代碼
mBinding.r.setAdapter(new BaseBindingAdapter(this,mListData,R.layout.main_item));
複製代碼

一兩行代碼便可配置好RecyclerView的適配器,是否是爽歪歪啊。若是僅僅是普通的展現和點擊知足不了你記得需求,你還能夠重寫onBindViewHolder方法。

mAdapter=new BaseBindingAdapter(this,R.layout.main_item){
            //可複寫
            @Override
            public void onBindViewHolder(BaseBindingVH holder, int position) {
                super.onBindViewHolder(holder, position);//複寫是不可刪除
            }
        };
複製代碼

在這裏你能夠根據position對數據或者view作出相應的處理。對於多佈局的RecyclerView可使用BaseMulTypeBindingAdapter類去實現,我就不過多解釋了。

最後,這是個人第一篇博客,求輕噴。後續我會繼續完善這個項目,並繼續更新文章分析Google Architecture Compontents組件庫和DataBinding的控件綁定用法。

相關文章
相關標籤/搜索