Establezca el adaptador de ViewPager a través de data binding

Tratando de usar el data binding de Android al adaptador para una ViewPager (controla los Fragments deslizables).

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

Si se hace desde la actividad, se vería así :

  .. mFooViewPager.adapter = FooPagerAdapter(fragmentFamanager, fragmentsList) .. 

Pregunta:

Ahora, ¿cómo se transfiere la funcionalidad del adaptador al file de enlace para actualizar los fragments de ViewPager utilizando la vinculación de datos?


Editar:

Según entiendo, tiene que ser algo como esto.

activity_foo.xml:

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

Y luego en un FooViewModel.kt:

 fun getFragments(): LiveData<List<BarFragment>>? = mFragments companion object { @BindingAdapter("bind:fragments") fun setAdapter(pager: ViewPager, adapter: BarPagerAdapter) { pager.adapter = adapter } } 

Edit2:

Decidió usar un ViewModel directamente (sin enlace) para establecer el adaptador de 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) } 

Consiguiendo:

Error: … layout \ actividad_foo.xml: 39 atributo 'com.foo.bar:adapter' no encontrado

Un @BindingAdapter debe ser estático en Java, por lo tanto debe ser anotado con @JvmStatic . Además, se supone que debe omitir todos los espacios de nombres con los attributes de enlace en la definición del adaptador. Además, el segundo parámetro necesita hacer reference al tipo que desea establecer. En tu caso, esto es LiveData<List<BarFragment>> . Entonces puede crear el adaptador estáticamente.

 companion object { @JvmStatic @BindingAdapter("fragments") fun setAdapter(pager: ViewPager, fragments: LiveData<List<BarFragment>>) { pager.adapter = createAdapterForFragments(fragments) } } 

Pero si los fragments serían un PagerAdapter , un adaptador de enlace no es necesario en absoluto. Como una implementación pnetworkingeterminada, el comstackdor busca un método setter determinado para el atributo. Entonces, si usa app:adapter , el método setAdapter() se usará automáticamente. Por lo tanto, debería ser suficiente simplemente poner esta definición de adaptador en el layout.

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

Sugiero usar este último y configurar el adaptador con viewModel no con el data binding.

Un poco de conveniencia de data binding para ViewPager y TabLayout que encontrará con ViewPagerDataBinding .

  • Construcción de aplicaciones Android con java y kotlin
  • Simplificado agregar y replace fragments en Kotlin
  • Los colors de Android Material Design no se aplican de forma coherente
  • Kotlin flatMap - map
  • tornadofx EventBus expande la fila de la tabla usando el object tableview
  • No se puede usar string.contains () en la expresión de kotlin `when`
  • RxJava 1.x .zip () no funciona en RxJava 2.0
  • cómo especificar el order de plugin de comstackdor maven
  • Cómo contar el time de ejecución de lo observable
  • Cómo establecer maxLength en Anko
  • ¿Cómo crear una matriz Java en Kotlin para @PropertySource?