比如说,常用的 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)