尝试使用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
}
}
如果从活动完成,则看起来像:
..
mFooViewPager.adapter = FooPagerAdapter(fragmentFamanager, fragmentsList)
..
问题:
现在如何将绑定文件的适配器功能转移到使用数据绑定更新片段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
}
}
EDIT2:
决定直接使用ViewModel
(不绑定)来设置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)
}
获得:
错误:... layout \ activity_foo.xml:找不到属性'com.foo.bar:adapter'
答案 0 :(得分:2)
@BindingAdapter
在Java中应该是静态的,因此可以使用@JvmStatic
进行注释。此外,您应该使用适配器定义中的绑定属性跳过所有名称空间。第二个参数也需要引用您要设置的类型。在您的情况下,这是LiveData<List<BarFragment>>
。然后,您可以静态创建适配器。
companion object {
@JvmStatic
@BindingAdapter("fragments")
fun setAdapter(pager: ViewPager, fragments: LiveData<List<BarFragment>>) {
pager.adapter = createAdapterForFragments(fragments)
}
}
但如果fragments
为PagerAdapter
,则根本不需要绑定适配器。作为默认实现,编译器会查找属性的给定setter方法。因此,如果您使用app:adapter
,则会自动使用setAdapter()
方法。因此,将此适配器定义放在布局中就足够了。
<android.support.v4.view.ViewPager
...
app:adapter"@{viewModel.fragments}"/>
我建议使用后者并使用viewModel
设置适配器而不是数据绑定。
使用ViewPagerDataBinding
可以找到ViewPager
和TabLayout
的一点点数据绑定。