基于Google MVVM框架的baseMVVM框架

基于Google MVVM框架的baseMVVM框架

前提说明:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容