基于Google MVVM框架的baseMVVM框架

栏目: IOS · Android · 发布时间: 5年前

内容简介:本人在项目中的一些总结和参考大佬的代码,综合了一个小型的Android vvm框架1.加入retrofit2 RxJava 2.使用GoogleArch大礼包,包含 LiveData ,ViewModel,LifeCycle 3.提供 DataBinding 自定义绑定事件(TextView,ImageView,) 4.集成张旭童的一行代码实现RecyclerView简书链接 5.基于RxJava的 RxBus,RxUtils继承Commonlib下的BaseActivity,并传入DataBinding生

本人在项目中的一些总结和参考大佬的代码,综合了一个小型的Android vvm框架 本框架适用于中小项目,并且对DataBinging有一定的了解。mvvm模式对数据展示累项目的开发十分友好。项目大或者页面逻辑复杂的项目请绕行MVP 项目地址: gitHub地址 https://github.com/dingdaidao/baseMVVM

主要特性:

1.加入retrofit2 RxJava 2.使用GoogleArch大礼包,包含 LiveData ,ViewModel,LifeCycle 3.提供 DataBinding 自定义绑定事件(TextView,ImageView,) 4.集成张旭童的一行代码实现RecyclerView简书链接 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的实现参考了张旭童大神的方法,上链接简书链接先看下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的控件绑定用法。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web Anatomy

Web Anatomy

Robert Hoekman Jr.、Jared Spool / New Riders / 2009-12-11 / USD 39.99

At the start of every web design project, the ongoing struggles reappear. We want to design highly usable and self-evident applications, but we also want to devise innovative, compelling, and exciting......一起来看看 《Web Anatomy》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具