Android kotlin двусторонняя привязка данных на androidx.viewpager.widget.ViewPager :: currentTab - PullRequest
0 голосов
/ 18 апреля 2020

Я пробовал обучающие программы на Inte rnet, чтобы добавить адаптер на 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.

1 Ответ

0 голосов
/ 18 апреля 2020

Каждый атрибут, который вы хотите привязать, должен соответствовать имени @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">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...