本人在项目中的一些总结和参考大佬的代码,综合了一个小型的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的控件绑定用法。