自定义 View 的 databinding 写法

99 阅读1分钟

比如说,常用的 ViewPager2, 我需要通过 databinding 的布局,使用 ObservableField 动态控制对象里面的 currentItem,可以这么写

@BindingAdapter(value = ["ViewPager2_currentItem"],
    requireAll = false)
fun ViewPager2_currentItem(
    view: ViewPager2,
    currentItem:Int
) {
   view.currentItem = currentItem   
}

如果要加入 ViewPager2 对 currentItem 的双向绑定,则需要这么写

/**
反向获取 get 值
 */
@InverseBindingAdapter(attribute = "ViewPager2_currentItem", event = "ViewPager2_currentItemChange")
fun ViewPager2_currentItem(view: ViewPager2):Int {
    return view.currentItem
}

@BindingAdapter("ViewPager2_currentItemChange",
    requireAll = false)
fun ViewPager2_currentItemChange(
    view: ViewPager2,
    inverseBindingListener: InverseBindingListener?
) {
    if (inverseBindingListener == null) {
    } else {
        view.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
            override fun onPageSelected(position: Int) {
                super.onPageSelected(position)
                inverseBindingListener.onChange()
            }
        })
    }
}

然后在使用的过程中可以这么写

<androidx.viewpager2.widget.ViewPager2
    android:id="@+id/fragment_list"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintTop_toBottomOf="@id/tab2Layout"
    app:layout_constraintBottom_toBottomOf="parent"
    ViewPager2_currentItem="@={vm.currentTab}"
    />

你的 ViewModel 对应的对象

/**
 * 当前选中 tab
 */
val currentTab = ObservableInt(0)