美文网首页
2020-08-20 自定义databinding双向绑定

2020-08-20 自定义databinding双向绑定

作者: 馒Care | 来源:发表于2020-08-20 10:11 被阅读0次

DataBinding
DataBinding是Google推出的用于完成数据绑定,实现MVVM架构的工具。常规使用请参考Google Jepack套件binding类的定义

参考

  1. InverseBindingAdapter
  2. InverseBindingMethod
  3. InverseBindingMethods
  4. InverseBindingListener
步骤一
  1. 双向绑定属性,需要的参数设置
  • 需要属性的getter和setter方法。
  • 需要属性发生变化时触发回调
步骤二
  • 使用BindingAdapter注解设置相关设置属性的setter函数,注解参数value是在xml中对应的属性名,方法的第一个参数是需要设置属性的view,第二个参数是需要设置的属性值


    image.png
步骤三

用InverseBindingAdapter定义getter函数。

attribute是xml中的属性名,event是设置属性监听的属性名,类型是InverseBindingListener。

image.png
步骤四

这一步主要实现双向绑定的过程,使用BindingAdapter注解设置与第三步中event值相同的回调函数的setter函数。如果构造函数有多个参数,需要设置BindingAdpter对应多个value


image.png
步骤五:
image.png

源码参考如下

package com.example.remark.binding;

import androidx.databinding.BindingAdapter;
import androidx.databinding.InverseBindingAdapter;
import androidx.databinding.InverseBindingListener;

import com.example.mvvmhabit.binding.command.BindingCommand;
import com.example.remark.widget.RatingBar;

/**
 * Desc:星星进度条 双向绑定业务
 * <p>
 * Date: 2019-10-11
 * Copyright: Copyright (c) 2010-2019
 * Company: 
 * Updater:
 * Update Time:
 * Update Comments:
 *
 * @Author: 
 */
public class RatingBarAdapter {

    @BindingAdapter("setStarStep")
    public static void setStarStep(final RatingBar ratingBar, final float step) {
        if (ratingBar.getStarStep() != step) {
            ratingBar.setStar(step);
        }

    }

    @InverseBindingAdapter(attribute = "setStarStep", event = "displayAttrChanged")
    public static float getStartStep(final RatingBar ratingBar) {
        return ratingBar.getStarStep();
    }

    @BindingAdapter(value = {"displayAttrChanged", "onRatingChange"},
            requireAll = false)
    public static void setChangeListener(final RatingBar view, final InverseBindingListener bindingListener, final BindingCommand<Float> onRatingChange) {

        view.setOnRatingChangeListener(new RatingBar.OnRatingChangeListener() {
            @Override
            public void onRatingChange(float ratingCount) {
                if (onRatingChange != null) {
                    onRatingChange.execute(ratingCount);
                }
                bindingListener.onChange();
            }
        });
    }

}

相关文章

网友评论

      本文标题:2020-08-20 自定义databinding双向绑定

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