我正在使用ViewModel和Livedata。我尝试使用以下代码获取视图模型中视图页面的当前位置
<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" />
内部视图模型我有
var selectedPos: MutableLiveData<Int> = MutableLiveData()
我在选定位置找到该值,并将其与 EditText 中的值进行比较。不知何故,我认为这个逻辑是正确的。但问题是虽然
android:selectedItemPosition="@={ viewModel.selectedPos }"
当我将此行添加到布局中时,它会导致数据绑定错误。
e: [kapt] 发生异常:android.databinding.tool.util.LoggedErrorException:发现数据绑定错误。
有人可以帮助我吗???
深入研究错误,它显示如下内容:
****/ 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) } })
第一个更高级,第二个更容易启动和运行。所以这取决于你。