android - 通过Data Binding设置ViewPager的adapter

标签 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
  }
}

如果从 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/

相关文章:

android - 在 Internet 上托管的 MP4 视频无法在 Android 操作系统上下载和播放 当大小大于 1,7MB 时

java - 将图像 URI 转换为文件对象

java - Android MapView - 扩展 OverlayItem 以存储用于在 onTap 中访问的 URL

android - 自定义操作栏菜单项一键不响应

android - 如何从后台删除相同 fragment 的旧条目?

Kotlin 和 RxJava 类型推断失败

android - 我在哪里可以下载 cocos2d-x 预构建二进制文件?

android - android fragment 中的 JDBC 不工作?

android - 使用协程访问数据库

java - 防止对 Java/Kotlin 中的类的依赖,但允许扩展