Android kotlin在androidx.viewpager.widget.ViewPager :: currentTab上的双向数据绑定

问题描述 投票:0回答:1

我已经尝试在Internet上的教程中在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'

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

android kotlin android-viewpager android-databinding 2-way-object-databinding
1个回答
0
投票

您要绑定的每个属性都必须与@BindingAdapter的名称匹配。Gradle找不到@BindingAdapter("currentTab")

您可以-编写currentTab BindingAdapter及其InverseBindingAdapter进行观察。-或快速解决方案:绑定简单的ViewPager.OnPageChangedListener并从中实现

@BindingAdapter("onPageChangeListener")
fun ViewPager.bindOnPageChangeListener(listener: ViewPager.OnPageChangeListener) {
    addOnPageChangeListener(listener)
}
<!-- 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:onPageChangeListener="@{viewModel.onPageChangeListener}"
    app:layout_constraintBottom_toTopOf="@+id/tabLayout"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">
© www.soinside.com 2019 - 2024. All rights reserved.