MVVM+Databinding+ARouter路由的简单讲解

简介
  • 简单介绍
  • 怎么使用
  • 代码展示和讲解
效果展示:
这快主要展示的跳转的效果,主要是在本APP里面跳转和跨Module直接的跳转主要为我们模块化开发提供方便:效果图展示:

这里写图片描述

简单介绍
  相信大家对MVVM这个框架不是很陌生的吧,它的底层实现就是通过DataBinding的
绑定实现的他的好处就是省去了我们频繁的寻找控件的id,我们直接就可以在xml里面
绑定Bean实体类的属性而赋值,如下代码:
<TextView
    android:text="@{bean.name}"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
    <TextView
        android:text="@{bean.sex}"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

我们在说下ARouter路由框架吧,它是阿里进行的一次对Router的封装。

什么是路由:说简单点就是映射页面跳转关系的,当然它也包含跳转相关的一切功能。
为什么需要路由:
  • 在一些复杂的业务场景下(比如电商),灵活性比较强,很多功能都是运营人员动态配置的,比如下发一个活动页面,我们事先并不知道具体的目标页面,但如果事先做了约定,提前做好页面映射,便可以自由配置。
  • 随着业务量的增长,客户端必然随之膨胀,开发人员的工作量越来越大,比如64K问题,比如协作开发问题。App一般都会走向组件化、插件化的道路,而组件化、插件化的前提就是解耦,那么我们首先要做的就是解耦页面之间的依赖关系。
  • 简化代码。数行跳转代码精简成一行代码。
ARouter的优势:
  • 支持直接解析标准URL进行跳转,并自动注入参数到目标页面中
  • 支持多模块工程使用
  • 支持添加多个拦截器,自定义拦截顺序
  • 支持依赖注入,可单独作为依赖注入框架使用
  • 支持InstantRun
  • 支持MultiDex(Google方案)
  • 映射关系按组分类、多级管理,按需初始化
  • 支持用户指定全局降级与局部降级策略
  • 页面、拦截器、服务等组件均自动注册到框架
  • 支持多种方式配置转场动画
  • 支持获取Fragment
  • 完全支持Kotlin以及混编
典型的应用:
  • 从外部URL映射到内部页面,以及参数传递与解析
  • 跨模块页面跳转,模块间解耦
  • 拦截跳转过程,处理登陆、埋点等逻辑
  • 跨模块API调用,通过控制反转来做组件解耦
dataBinding配置:

显示在app层的build.gradle里面

android{
.....
dataBinding{
enabled = true
}
}
ARouter配置:

在app层的build.gradle里面加入:

android {
    defaultConfig {
    ...
    javaCompileOptions {
        annotationProcessorOptions {
        arguments = [ moduleName : project.getName() ]
        }
    }
    }
}

dependencies {
    compile 'com.alibaba:arouter-api:1.2.1.1'
    annotationProcessor 'com.alibaba:arouter-compiler:1.1.2.1'
}
代码展示和讲解:

配置好上面以后,我们先用MVVM+dataBinding来布局和定义监听事件;
我们开始在xml文件里面布局的话,就在最外层加上标签和标签;
在标签里面就要指定我们的实体Bean对象和点击事件所封装的实体类:
下面这段代码是我们定义的一个面是一个Bean实体类和一个点击事件的类来引用
还有一个RecyclerView的列表展示;

<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"
    >
    <data>
        <variable
            name="bean"
            type="com.weizhen.ceshidemo.CeShiBean"/>
        <variable
            name="event"
            type="com.weizhen.ceshidemo.events.BindEvents"/>

    </data>
<LinearLayout
   android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.weizhen.ceshidemo.CeshiActivity">
<TextView
    android:text="@{bean.name}"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
    <TextView
        android:text="@{bean.sex}"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button
        android:text="点击换名"
        android:onClick="@{(view)->event.setData(view)}"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
<android.support.v7.widget.RecyclerView
    android:id="@+id/recyview"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</android.support.v7.widget.RecyclerView>
</LinearLayout>
</layout>

下面是实体Bean的类:


public class CeShiBean {
    private String name;
    private String sex;

    public CeShiBean(String name, String sex) {
        this.name = name;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public CeShiBean() {
        super();
    }
}

下面是点击事件的实体类

public class BindEvents {
    CeshiActivity mCeshiActivity;
    ActivityCeshiBinding bind;
    public BindEvents(Activity activity) {
        this.mCeshiActivity= (CeshiActivity) activity;
        this.bind=((CeshiActivity) activity).mBinding;
    }
    public void setData(View view){
        bind.setBean(new CeShiBean("修改名","女"));

    }
}

还有实现列表展示的封装的ViewHoldler:


public class BindingViewHolder<T extends ViewDataBinding> extends RecyclerView.ViewHolder{
    private T mbinding;
    public BindingViewHolder(T binding) {
        super(binding.getRoot());
        mbinding=binding;
    }
    public T getBinding(){
        return mbinding;
    }
}

下面是我么的Adapter:


public class MyAdapter extends RecyclerView.Adapter<BindingViewHolder> {
   private Context mContext;
   private List<ItemBean> data;
    private OnItemClickListener mOnItemClickListener;
    private LayoutInflater mLayoutInflater;
//定义一个接口来实现条目点击事件
    public interface OnItemClickListener{
//    定义一个点击方法
    void OnMyBeanClick(ItemBean itemBean,int position);
}
//对外提供一个方法调用点击事件
    public void setonListener(OnItemClickListener listener){
        mOnItemClickListener=listener;
    }
    public MyAdapter(Context context, List<ItemBean> data) {
        mContext = context;
        this.data = data;
        mLayoutInflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public BindingViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//        添加viewholder的布局   返回给viewhlder
        ViewDataBinding inflate = DataBindingUtil.inflate(mLayoutInflater, R.layout.item, parent, false);

        return new BindingViewHolder(inflate);
    }

    @Override
    public void onBindViewHolder(BindingViewHolder holder, final int position) {
        final ItemBean itemBean = data.get(position);
//        绑定xml里里面的控件并赋值
        holder.getBinding().setVariable(BR.itembean,itemBean);
//        提交执行绑定
        holder.getBinding().executePendingBindings();
//        根据每一个item来实现点击事件传递给我们自定义的接口  调用方法实现接口回调
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mOnItemClickListener!=null){
                    mOnItemClickListener.OnMyBeanClick(itemBean,position);
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return data.size();
    }

}

还有就是我们的Activity


@Route(path = "/con/ceshi")
public class CeshiActivity extends AppCompatActivity {
public ActivityCeshiBinding mBinding;
    List<ItemBean> list=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_ceshi);
        mBinding= DataBindingUtil.setContentView(this,R.layout.activity_ceshi);
        initData();
        mBinding.setBean(new CeShiBean("显示","男"));
        mBinding.setEvent(new BindEvents(this));
        mBinding.recyview.setLayoutManager(new LinearLayoutManager(this));
        MyAdapter myAdapter = new MyAdapter(this, list);
        mBinding.recyview.setAdapter(myAdapter);
//        设置点击事件
        myAdapter.setonListener(new MyAdapter.OnItemClickListener() {
            @Override
            public void OnMyBeanClick(ItemBean itemBean, int position) {
                   Toast.makeText(CeshiActivity.this,"点击的条目是---》"+position,Toast.LENGTH_SHORT).show();
            }
        });

    }

    private void initData() {
        for (int i = 0; i < 10; i++) {
            ItemBean itemBean = new ItemBean();
            itemBean.setName("今天"+i);
            itemBean.setJianjie("jsgsgfgafk"+i);
            list.add(itemBean);
        }
    }
}
细心的可以发现我的Activity上面又加了一个注解Router,这下我们就说下ARouter的路由跳转了 ,我们这块定义了@Router括号里面我们指定了路径path,这个就是我们这个Activity的路径别的页面想实现跳转的话,就可以根据我们的路径来跳转,下面我们有段跳转的方法也特别的简单:
//                这是一种单利模式的封装build里面是我们跳转的路径
              ARouter.getInstance().build("/com/h")
//                      withString里面是我们跳转后传递的类型和参数
                      .withString("mkey","添加行我的数据")
//              navigation就是执行跳转里面可以看到他分的组名
                      .navigation(this, new NavCallback() {
                          @Override
                          public void onArrival(Postcard postcard) {
                              String group = postcard.getGroup();
                              Log.e("zhao", "分组是: " + group);
                                 Toast.makeText(MainActivity.this,"显示--》"+group,Toast.LENGTH_SHORT).show();
                          }
                      });

下面说下我们ARouter能够传递的类型:

//基础类型

.withString( String key, String value )
.withBoolean( String key, boolean value)
.withChar( String key, char value )
.withShort( String key, short value)
.withInt( String key, int value)
.withLong( String key, long value)
.withDouble( String key, double value)
.withByte( String key, byte value)
.withFloat( String key, float value)
.withCharSequence( String key,  CharSequence value)

//数组类型

.withParcelableArrayList( String key, ArrayList<? extends Parcelable > value)
.withStringArrayList( String key,  ArrayList<String> value)
.withIntegerArrayList( String key, ArrayList<Integer> value)
.withSparseParcelableArray( String key, SparseArray<? extends Parcelable> value)
.withCharSequenceArrayList( String key, ArrayList<CharSequence> value)
.withShortArray( String key,  short[] value)
.withCharArray( String key, char[] value)
.withFloatArray( String key, float[] value)
.withCharSequenceArray( String key,  CharSequence[] value)

//Bundle 类型

.with( Bundle bundle )

//Activity 跳转动画

.withTransition(int enterAnim, int exitAnim)

//其他类型

.withParcelable( String key, Parcelable value)
.withParcelableArray( String key,  Parcelable[] value)
.withSerializable( String key, Serializable value)
.withByteArray( String key, byte[] value)
.withTransition(int enterAnim, int exitAnim)
写到这里已经进行的差不多了,基本上都已经把基础的东西分享完了,大家还是多多的练习和实践才会有更大的进步,多谢大家观看,也希望大神指点指点,有什么说的不对的可以留言我会改正,下面是我的完整的Demo在github上会继续更新新的知识。。。
完整Demo的github下载链接地址https://github.com/gaoweizhen/CeShiDEMO1
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值