尝试使用 Android 的 Data Binding ViewPager
的适配器(控制可滑动的 Fragments
)。
FooPagerAdapter.kt:
class FooPagerAdapter(fm: Fragmentmanager, private val mFragments: List<BarFragment>) : FragmentStatePagerAdapter(fm) {
override fun getItem(position: int): Fragment {
return mFragments(position)
}
override fun getCount(): Int {
return mFragments.size
}
}
如果从 Activity 完成,它看起来像:
..
mFooViewPager.adapter = FooPagerAdapter(fragmentFamanager, fragmentsList)
..
问题:
现在如何将适配器功能传输到绑定(bind)文件以使用数据绑定(bind)更新 fragment ViewPager?
编辑:
据我了解,它必须是这样的。
activity_foo.xml:
<android.support.v4.view.ViewPager
..
app:fragments"${viewModel.fragments}"/>
然后在 FooViewModel.kt 中:
fun getFragments(): LiveData<List<BarFragment>>? = mFragments
companion object {
@BindingAdapter("bind:fragments")
fun setAdapter(pager: ViewPager, adapter: BarPagerAdapter) {
pager.adapter = adapter
}
}
编辑2:
决定直接使用 ViewModel
(不绑定(bind))来设置 ViewPager
的适配器。
activity_foo.xml:
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewModel"
type="com.foo.bar.viewmodels.FooViewModel"/>
</data>
..
<android.support.v4.view.ViewPager
..
app:adapter="%{viewModel.adapter}"/>
FooViewModel.kt:
class FooViewModel(application: Application) : AndroidViewModel(application) {
..
fun setAdapter(pager: ViewPager, fragments:List<PeriodFragment>) {
pager.adapter = PeriodsPagerAdapter(mFragmentManager!!, periods)
}
获得:
Error:...layout\activity_foo.xml:39 attribute 'com.foo.bar:adapter' not found
最佳答案
A @BindingAdapter
在 Java 中应该是静态的,因此用 @JvmStatic
注释.此外,您应该跳过适配器定义中具有绑定(bind)属性的所有命名空间。此外,第二个参数需要引用您要设置的类型。在您的情况下,这是 LiveData<List<BarFragment>>
.然后您可以静态创建适配器。
companion object {
@JvmStatic
@BindingAdapter("fragments")
fun setAdapter(pager: ViewPager, fragments: LiveData<List<BarFragment>>) {
pager.adapter = createAdapterForFragments(fragments)
}
}
但是如果 fragments
将是 PagerAdapter
,根本不需要绑定(bind)适配器。作为默认实现,编译器会为属性查找给定的 setter 方法。所以如果你使用 app:adapter
, setAdapter()
方法将自动使用。因此,只需将此适配器定义放在布局中就足够了。
<android.support.v4.view.ViewPager
...
app:adapter"@{viewModel.fragments}"/>
我建议使用后者并使用 viewModel
设置适配器不与数据绑定(bind)。
为 ViewPager
提供一点数据绑定(bind)便利和 TabLayout
你会发现 ViewPagerDataBinding
.
关于android - 通过Data Binding设置ViewPager的adapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44485543/