通过数据绑定设置ViewPager的适配器

时间:2017-06-11 15:31:01

标签: android android-fragments kotlin

尝试使用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'

1 个答案:

答案 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)
  }
}

但如果fragmentsPagerAdapter,则根本不需要绑定适配器。作为默认实现,编译器会查找属性的给定setter方法。因此,如果您使用app:adapter,则会自动使用setAdapter()方法。因此,将此适配器定义放在布局中就足够了。

<android.support.v4.view.ViewPager
  ...
  app:adapter"@{viewModel.fragments}"/>

我建议使用后者并使用viewModel设置适配器而不是数据绑定。

使用ViewPagerDataBinding可以找到ViewPagerTabLayout的一点点数据绑定。