最火開源框架MVVMhabit
一. 準(zhǔn)備工作
二. 快速上手
三. 數(shù)據(jù)綁定
四. 其他
1、在TextViewModel中定義
//按鈕的點(diǎn)擊事件
public View.OnClickListener loginOnClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
}
};
2实蓬、在登錄按鈕標(biāo)簽中綁定
android:onClick="@{viewModel.loginOnClick}"
這樣一來默蚌,用戶的點(diǎn)擊事件直接被回調(diào)到ViewModel層了鸭限,更好的維護(hù)了業(yè)務(wù)邏輯
這就是強(qiáng)大的databinding框架雙向綁定的特性党饮,不用再給控件定義id悠抹,setText()夭织,setOnClickListener()网杆。
但是,光有這些也颤,完全滿足不了我們復(fù)雜業(yè)務(wù)的需求把蠡谩!MVVMHabit閃亮登場:它有一套自定義的綁定規(guī)則翅娶,可以滿足大部分的場景需求文留,請繼續(xù)往下看好唯。
自定義綁定
還拿點(diǎn)擊事件說吧,不用傳統(tǒng)的綁定方式厂庇,使用自定義的點(diǎn)擊事件綁定渠啊。
在TextViewModel中定義
//登錄按鈕的點(diǎn)擊事件
public BindingCommand loginOnClickCommand = new BindingCommand(new BindingAction() {
@Override
public void call() {
}
});
在activity_login中定義命名空間
xmlns:binding="http://schemas.android.com/apk/res-auto"
在登錄按鈕標(biāo)簽中綁定
binding:onClickCommand="@{viewModel.loginOnClickCommand}"
這和原本傳統(tǒng)的綁定不是一樣嗎?不权旷,這其實(shí)是有差別的。使用這種形式的綁定贯溅,在原本事件綁定的基礎(chǔ)之上拄氯,帶有防重復(fù)點(diǎn)擊的功能,1秒內(nèi)多次點(diǎn)擊也只會(huì)執(zhí)行一次操作它浅。如果不需要防重復(fù)點(diǎn)擊译柏,可以加入這條屬性
binding:isThrottleFirst="@{Boolean.TRUE}"
那這功能是在哪里做的呢?答案在下面的代碼中姐霍。
//防重復(fù)點(diǎn)擊間隔(秒)
public static final int CLICK_INTERVAL = 1;
/**
* requireAll 是意思是是否需要綁定全部參數(shù), false為否
* View的onClick事件綁定
* onClickCommand 綁定的命令,
* isThrottleFirst 是否開啟防止過快點(diǎn)擊
*/
@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秒鐘內(nèi)只允許點(diǎn)擊1次
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object object) throws Exception {
if (clickCommand != null) {
clickCommand.execute();
}
}
});
}
}
onClickCommand方法是自定義的鄙麦,使用@BindingAdapter注解來標(biāo)明這是一個(gè)綁定方法。在方法中使用了RxView來增強(qiáng)view的clicks事件镊折,.throttleFirst()限制訂閱者在指定的時(shí)間內(nèi)重復(fù)執(zhí)行胯府,最后通過BindingCommand將事件回調(diào)出去,就好比有一種攔截器恨胚,在點(diǎn)擊時(shí)先做一下判斷骂因,然后再把事件沿著他原有的方向傳遞。