首页 > 解决方案 > Android kotlin androidx.viewpager.widget.ViewPager::currentTab 上的两种方式数据绑定

问题描述

我已经尝试过互联网上的教程来添加适配器androidx.viewpager.widget.ViewPager以在当前选项卡上获得两种方式的数据绑定。我到了那个适配器

// adapter file
@BindingAdapter("currentTab")
@JvmStatic
fun setTab(pager: ViewPager, itemLiveData: MutableLiveData<Int>) {
   itemLiveData.value?.let {

        if (pager.currentItem != it) {
            pager.setCurrentItem(it, true)
        }
    }
}

@InverseBindingAdapter(attribute = "currentItem")
@JvmStatic
fun getTab(pager: ViewPager) = pager.currentItem
<!-- layout file -->
<androidx.viewpager.widget.ViewPager
    android:id="@+id/viewPager"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginTop="70dp"
    app:adapter="@{viewModel.adapter}"
    app:currentTab="@={viewModel.currentItem}"
    app:layout_constraintBottom_toTopOf="@+id/tabLayout"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

当我尝试构建应用程序时,我收到了这个错误(带有--stacktrace选项):

Could not find event 'currentItemAttrChanged' on View type 'androidx.viewpager.widget.ViewPager'

我找不到任何教程/答案,所以我在这里问是否有人对此有答案。谢谢

编辑: 我试过了,@InverseBindingAdapter(attribute = "currentTab")但它给了我同样的错误:Could not find event 'currentTabAttrChanged' on View type 'androidx.viewpager.widget.ViewPager'

问题是我不知道currentTab更改时的事件名称调用。

标签: androidkotlinandroid-viewpagerandroid-databinding2-way-object-databinding

解决方案


2 路绑定始终需要 3 个适配器。第一个(常规)将数据从 vm 传输到视图,第二个(反向)以相反的方式传输,第三个(事件)告诉第二个何时触发。@InverseBindingAdapter有 2 个属性:attributeevent. 如果不指定后者,则默认为属性名称+“AttrChanged”。因为没有第三个它就无法工作。这就是错误消息所说的。

ViewPager 不提供专门的“onPageChanged”监听器。相反,它有 3-fold OnPageChangeListener。但是创建一个必需的事件是微不足道的:

@BindingAdapter("currentTabAttrChanged")
public static void currentTabAttrChanged(@NonNull ViewPager viewpagerView, @Nullable InverseBindingListener listener) {
    if (listener != null) {
        viewpagerView.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                listener.onChange();
            }
        });
    }
}

推荐阅读