android ViewPager2 currentItem 双向绑定写法

167 阅读1分钟

如题,在实际项目中,经常要控制 ViewPager2 的翻页,频繁操作时,可以使用 databinding 使用变量来可以轻松控制,一次定义,终生受益

双向绑定的写法

@BindingAdapter(value = ["ViewPager2_currentItem"],
    requireAll = false)
fun ViewPager2_currentItem(
    view: ViewPager2,
    currentItem:Int
) {
    view.currentItem = 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()
            }
        })
    }
}

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

用法

在你的布局中这样写

<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)