基于Google MVVM框架的baseMVVM框架
前提說明:
本人在項目中的一些總結(jié)和參考大佬的代碼,綜合了一個小型的Android vvm框架
本框架適用于中小項目短纵,并且對DataBinging有一定的了解萝喘。mvvm模式對數(shù)據(jù)展示累項目的開發(fā)十分友好胡野。項目大或者頁面邏輯復雜的項目請繞行MVP
項目地址:gitHub地址
https://github.com/dingdaidao/baseMVVM
主要特性:
1.加入retrofit2 RxJava
2.使用GoogleArch大禮包,包含 LiveData ,ViewModel,LifeCycle
3.提供 DataBinding 自定義綁定事件(TextView,ImageView傲绣,)
4.集成張旭童的一行代碼實現(xiàn)RecyclerView 簡書鏈接
5.基于RxJava的 RxBus,RxUtils
如何使用:
1.activity巩踏,xml秃诵,和viewModel該怎么寫
繼承Commonlib下的BaseActivity,并傳入DataBinding生成的xml對應的ViewDataBing類和該頁面的ViewModel類
public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewModel> {
注意ActivityMainBinding該類是根據(jù)activity_main.xml的命名來生成的。我們先來看下activity_main.xml文件
<!--跟布局用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)的id
@Override
public MainViewModel initViewModel() {
return new MainViewModel();
}
initViewModel是為了獲取對應viewModel的實例
@Override
public void initViewObservable() {
}
initViewObservable是為了初始化viewModel層產(chǎn)生數(shù)據(jù)變化時的監(jiān)聽事件菠净,比如viewModel中一個天氣情況的數(shù)據(jù)weatherLiveData產(chǎn)生了變化,則weatherLiveData.observe(this,(params){
//處理數(shù)據(jù)變化
});一般來說我們會把數(shù)據(jù)通過dataBinding直接塞給xml彪杉,View層毅往,但也不排除其他復雜一點的操作,在xml中無法處理派近。所以攀唯,可以在initViewObservable中初始化LiveData的監(jiān)聽事件。我們再來看下ViewModel類
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連用,實現(xiàn)雙向綁定曙强,數(shù)據(jù)驅(qū)動模型残拐。在view層中綁定LiveData,在LiveData中的數(shù)據(jù)產(chǎn)生變化時碟嘴,LiveData通過Observe通知到DataBinding綁定的控件溪食,更新顯示數(shù)據(jù)∧壬龋或者错沃,view產(chǎn)生變化的時候,view綁定的LiveData也會更著頁面更新雀瓢。
2.RecycleView的實現(xiàn)
recyclerView的實現(xiàn)參考了張旭童大神的方法枢析,上鏈接簡書鏈接先看下item中xml的實現(xiàn):
<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>
定義傳入數(shù)據(jù)的類型String和對應name data(此為固定,因為已經(jīng)在item.xml中定義了通用id:data刃麸,這樣在代碼中配置adapter的時候就不用傳該item的variableId了)醒叁。
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);//復寫是不可刪除
}
};
在這里你可以根據(jù)position對數(shù)據(jù)或者view做出相應的處理饮睬。對于多布局的RecyclerView可以使用BaseMulTypeBindingAdapter類去實現(xiàn)租谈,我就不過多解釋了。
最后捆愁,這是我的第一篇博客割去,求輕噴。后續(xù)我會繼續(xù)完善這個項目昼丑,并繼續(xù)更新文章分析Google Architecture Compontents組件庫和DataBinding的控件綁定用法劫拗。