android - Android kotlin androidx.viewpager.widget.ViewPager::currentTab 上的两种方式数据绑定
问题描述
我已经尝试过互联网上的教程来添加适配器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
更改时的事件名称调用。
解决方案
2 路绑定始终需要 3 个适配器。第一个(常规)将数据从 vm 传输到视图,第二个(反向)以相反的方式传输,第三个(事件)告诉第二个何时触发。@InverseBindingAdapter
有 2 个属性:attribute
和event
. 如果不指定后者,则默认为属性名称+“AttrChanged”。因为没有第三个它就无法工作。这就是错误消息所说的。
ViewPager 不提供专门的“onPageChanged”监听器。相反,它有 3-fold 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();
}
});
}
}
推荐阅读
- javascript - javascript计算时如何绘制页面?
- asp.net - 如何在 sitecore 设置中添加 pdf 以获得 404 和 301 状态
- python - 根据具有数百万行的数据框中的匹配条件,更快地识别和比较行
- nginx - nginx 配置中的条件块显然不起作用
- android - Send get request in kotlin (Android )
- database - ArangoDB - 索引比拥有更多集合更好吗?
- apache-nifi - 如何在 Nifi 中打印压缩数据流内容
- r - 子集后数据不再是数字
- dataweave - Dataweave:当月过去的天数和剩余天数
- applescript - AXURL 的 AppleScript 值失败,AppleEvent 处理程序失败