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

Я использую 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: обнаружены ошибки привязки данных.

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

1 Ответ

0 голосов
/ 14 января 2019

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

****/ 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) }
        })
    

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

...