Как проверить значение в EditText со значением позиции текущего элемента в ViewPager с помощью наблюдателя?

1

Я использую ViewModel и Livedata. Я попытался получить текущую позицию ViewPager в ViewModel с помощью следующего кода

   <android.support.v4.view.ViewPager
            android:id="@+id/moveFromPlansViewPager"
            android:layout_width="0dp"
            android:layout_height="72dp"
            android:layout_marginTop="16dp"
            android:clipToPadding="false"
            android:selectedItemPosition="@={ viewModel.selectedPos }"
            android:paddingStart="16dp"
            android:paddingEnd="16dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/moveFromHeaderTextView" />

Внутри ViewModel у меня есть

var selectedPos: MutableLiveData<Int> = MutableLiveData()

И я нахожу значение в выбранной позиции и сравниваю его со значением в EditText. Почему-то я считаю эту логику правильной. Но проблема в то время как

 android:selectedItemPosition="@={ viewModel.selectedPos }"

Когда я добавляю эту строку в макет, это вызывает ошибку привязки данных.

e: [kapt] Возникла исключительная ситуация: android.databinding.tool.util.LoggedErrorException: Обнаружены ошибки привязки данных.

Кто-нибудь может мне помочь???

Теги:
viewmodel
android-livedata

1 ответ

2

Погружаясь глубже в ошибку, она показывает что-то вроде:

****/ data binding error ****msg:Cannot find the getter for attribute 'android:selectedItemPosition' with value type java.lang.Integer on android.support.v4.view.ViewPager ****\ data binding error ****

Практически это означает, что этот конкретный атрибут не может быть связан из коробки (и вы не можете использовать его как этот android:selectedItemPosition="2", f.ex.)

Есть пара альтернатив

  • Вы можете добавить обязательный адаптер. F.ex. здесь есть многообещающий
  • Сделайте это по-старому: попросите наблюдателя для MutableLiveData selectedPos во фрагменте, а затем просто выполните обновление там вручную:

    viewModel.selectedPos.observe(this, Observer { position ->
            position?.let { moveToSavingsPlansViewPager.setCurrentItem(it, true) }
        })
    

Первый более продвинутый, второй легче запустить. Так что решать вам.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню