本人在項目中的一些總結和參考大佬的代碼,綜合了一個小型的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
繼承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
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的控件綁定用法。