androidx.viewpager.widget.viewpager::currentTab上的Android kot



我在互联网上尝试过在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更改时的事件名称调用。

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

您可以
-编写currentTabBindingAdapter+其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">

双向绑定总是需要3个适配器。第一个(常规(将数据从vm拖到视图,第二个(反向(以相反的方式拖,第三个(事件("告诉"第二个何时激发。@InverseBindingAdapter有两个属性:attributeevent。如果不指定后者,则默认为属性名称+";AttrChanged";。因为没有第三个就无法工作。这就是错误消息所说的。

ViewPager不提供专门的";onPageChanged";听众。相反,它具有3倍的OnPageChangeListener。但是创建一个必需的事件是微不足道的:

@BindingAdapter("currentTabAttrChanged")
public static void currentTabAttrChanged(@NonNull ViewPager viewpagerView, @Nullable InverseBindingListener listener) {
if (listener != null) {
viewpagerView.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
listener.onChange();
}
});
}
}

听起来您希望从ViewModel内部收到有关ViewPager中页面更改的通知。在这种情况下,正如Benoit Guina所指出的,您可以像这样绑定OnPageChangeListener

在您的xml文件中,将您的视图寻呼机表示为:

android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:setPageChangeListener="@{myViewModel.pageChangeCallback}" />

请注意,我们有一个名为setPageChangeListener的自定义属性。提供给该属性的值是从我们的视图模型中获得的。我们在BindingAdapters文件中定义自定义属性,如下所示:

/**
* set listener for view pager changes
*/
@BindingAdapter("setPageChangeListener")
fun ViewPager2.setPageChangeListener(pageChangeListener: ViewPager2.OnPageChangeCallback) {
registerOnPageChangeCallback(pageChangeListener)
}

最后,我们在视图模型中定义监听器。因为侦听器在视图模型中,所以当视图寻呼机发生更改时,它可以修改该视图模型中的属性。

/**
* In the View Model
*/
val currentPageLiveData = MutableLiveData(0)
val pageChangeCallback = object: ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
currentPageLiveData.value = position
}
}

相关内容

  • 没有找到相关文章