DataBinding 輸入控件的雙向綁定數據綁定實現

熟悉DataBinding的小伙伴都知道,使用EditText控件是可以通過使用@={}實現雙向數據綁定,但如果是非官方的輸入控件類呢?答案顯而易見,是不可以滴,那么我們如何實現像EditText那樣的雙向數據綁定功能?接下來為您揭曉。

1. 第一步,getter方法編寫
需要在方法前加入注解@InverseBindingAdapter, attribute表示你要綁定的值名稱;event表示你要綁定的時間名稱,可以使用控件的設置監聽事件的方法命名,

    @InverseBindingAdapter(attribute = "rate", event = "setOnRatingSliderChangeListener")
    @JvmStatic
    fun getRating(view: SmileBar):Int{
         return view.rating
    }

2.第二步,setter方法編寫

這一步很簡單,主要是為控件賦值,value需要和上一步的attribute一致。

 @BindingAdapter(value ="rate")
    @JvmStatic
    fun setRating(view: SmileBar, rate:Int){
        view.rating = rate
    }

3. 第三步,監聽值的變化

這一步主要是讓Databinding知道數據發生變化了,需要將控件的值逆向輸出;該方法的第二個參數為InverseBindingListener是寫死的,這個法主要為控件添加監聽事件,當其變化時調用InverseBindingListener的onChange方法。需要和第一步的event一致。

@BindingAdapter(value = "setOnRatingSliderChangeListener")
    @JvmStatic
    fun setRatingListener(view:SmileBar, listener: InverseBindingListener){
        view.setOnRatingSliderChangeListener(object :SmileBar.OnRatingSliderChangeListener{
            override fun onPendingRating(p0: Int) {
            }
            override fun onFinalRating(p0: Int) {
               listener.onChange()
            }
            override fun onCancelRating() {
            }
        })
    }

4. 使用示例

這是一個打分控件,通過使用@={},當其等級變化時,item的rate值會變得和該控件的rate值相同

<com.eugeneek.smilebar.SmileBar
                    android:id="@+id/smile_rating"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    app:smileHeight="@dimen/icon_bar"
                    app:smileWidth="@dimen/icon_bar"
                    app:horizontalSpacing="@dimen/interval_text"
                    app:smileDefault="@drawable/ic_smile"
                    app:smileRate1="@drawable/ic_smile1"
                    app:smileRate2="@drawable/ic_smile2"
                    app:smileRate3="@drawable/ic_smile3"
                    app:smileRate4="@drawable/ic_smile4"
                    app:smileRate5="@drawable/ic_smile5"
                    android:layout_marginLeft="@dimen/interval_medium"
                    android:layout_toEndOf="@id/tv_label_rate"
                    app:rate="@={item.rate}"
                    />
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容