前提说明:
本人在项目中的一些总结和参考大佬的代码, 综合了一个小型的 Android vvm 框架 本框架适用于中小项目, 并且对 DataBinging 有一定的了解. mvvm 模式对数据展示累项目的开发十分友好. 项目大或者页面逻辑复杂的项目请绕行 MVP 项目地址: GitHub 地址 https://github.com/dingdaidao/baseMVVM https://github.com/dingdaidao/baseMVVM
主要特性:
1. 加入 retrofit2 RxJava 2. 使用 GoogleArch 大礼包, 包含 LiveData ,ViewModel,LifeCycle 3. 提供 DataBinding 自定义绑定事件 (TextView,ImageView,) 4. 集成张旭童的一行代码实现 RecyclerView 简书链接 https://www.jianshu.com/p/bf8d95dfd60a 5. 基于 RxJava 的 RxBus,RxUtils
如何使用:
1.activity,xml, 和 viewModel 该怎么写
继承 Commonlib 下的 BaseActivity, 并传入 DataBinding 生成的 xml 对应的 ViewDataBing 类和该页面的 ViewModel 类
public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewModel> {
注意 ActivityMainBinding 该类是根据 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 层产生数据变化时的监听事件, 比如 viewModel 中一个天气情况的数据 weatherLiveData 产生了变化, 则 weatherLiveData.observe(this,(params){ // 处理数据变化 }); 一般来说我们会把数据通过 dataBinding 直接塞给 xml,View 层, 但也不排除其他复杂一点的操作, 在 xml 中无法处理. 所以, 可以在 initViewObservable 中初始化 LiveData 的监听事件. 我们再来看下 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 连用, 实现双向绑定, 数据驱动模型. 在 view 层中绑定 LiveData, 在 LiveData 中的数据产生变化时, LiveData 通过 Observe 通知到 DataBinding 绑定的控件, 更新显示数据. 或者, view 产生变化的时候, view 绑定的 LiveData 也会更着页面更新.
2.RecycleView 的实现
recyclerView 的实现参考了张旭童大神的方法, 上链接简书链接 https://www.jianshu.com/p/bf8d95dfd60a 先看下 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 了).
- 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 的控件绑定用法.
来源: https://juejin.im/post/5c7f93bef265da2d85330539