美文网首页
onClick绑定【最火开源框架MVVMHabit简单集成】

onClick绑定【最火开源框架MVVMHabit简单集成】

作者: 大白520 | 来源:发表于2020-04-14 23:43 被阅读0次

最火开源框架MVVMhabit
一. 准备工作
二. 快速上手

三. 数据绑定

  1. TextView绑定
  2. onClick绑定
  3. ImageView绑定
  4. ListView绑定
  5. RecyclerView绑定

四. 其他

  1. toolbar头部标题
  2. 底部tabBar第三方按钮

1、在TextViewModel中定义

//按钮的点击事件
public View.OnClickListener loginOnClick = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
            
    }
};

2、在登录按钮标签中绑定

android:onClick="@{viewModel.loginOnClick}"

这样一来,用户的点击事件直接被回调到ViewModel层了,更好的维护了业务逻辑

这就是强大的databinding框架双向绑定的特性,不用再给控件定义id,setText(),setOnClickListener()。

但是,光有这些,完全满足不了我们复杂业务的需求啊!MVVMHabit闪亮登场:它有一套自定义的绑定规则,可以满足大部分的场景需求,请继续往下看。

自定义绑定

还拿点击事件说吧,不用传统的绑定方式,使用自定义的点击事件绑定。

在TextViewModel中定义

//登录按钮的点击事件
public BindingCommand loginOnClickCommand = new BindingCommand(new BindingAction() {
    @Override
    public void call() {
            
    }
});

在activity_login中定义命名空间

xmlns:binding="http://schemas.android.com/apk/res-auto"

在登录按钮标签中绑定

binding:onClickCommand="@{viewModel.loginOnClickCommand}"

这和原本传统的绑定不是一样吗?不,这其实是有差别的。使用这种形式的绑定,在原本事件绑定的基础之上,带有防重复点击的功能,1秒内多次点击也只会执行一次操作。如果不需要防重复点击,可以加入这条属性

binding:isThrottleFirst="@{Boolean.TRUE}"

那这功能是在哪里做的呢?答案在下面的代码中。

//防重复点击间隔(秒)
public static final int CLICK_INTERVAL = 1;

/**
* requireAll 是意思是是否需要绑定全部参数, false为否
* View的onClick事件绑定
* onClickCommand 绑定的命令,
* isThrottleFirst 是否开启防止过快点击
*/
@BindingAdapter(value = {"onClickCommand", "isThrottleFirst"}, requireAll = false)
public static void onClickCommand(View view, final BindingCommand clickCommand, final boolean isThrottleFirst) {
    if (isThrottleFirst) {
        RxView.clicks(view)
        .subscribe(new Consumer<Object>() {
            @Override
            public void accept(Object object) throws Exception {
                if (clickCommand != null) {
                    clickCommand.execute();
                }
            }
        });
    } else {
        RxView.clicks(view)
        .throttleFirst(CLICK_INTERVAL, TimeUnit.SECONDS)//1秒钟内只允许点击1次
        .subscribe(new Consumer<Object>() {
            @Override
            public void accept(Object object) throws Exception {
                if (clickCommand != null) {
                    clickCommand.execute();
                }
            }
        });
    }
}

onClickCommand方法是自定义的,使用@BindingAdapter注解来标明这是一个绑定方法。在方法中使用了RxView来增强view的clicks事件,.throttleFirst()限制订阅者在指定的时间内重复执行,最后通过BindingCommand将事件回调出去,就好比有一种拦截器,在点击时先做一下判断,然后再把事件沿着他原有的方向传递。

相关文章

网友评论

      本文标题:onClick绑定【最火开源框架MVVMHabit简单集成】

      本文链接:https://www.haomeiwen.com/subject/rtbtjctx.html