¿Hay alguna manera de hacer que scroll de ViewPager DecorView tenga el contenido del fragment?

Estoy tratando de get un ViewPager.DecorView que se encuentra debajo de las tabs de ViewPager , que no se desliza hacia la izquierda / derecha con las páginas, sino que se desplaza hacia arriba (o, al less, hacia afuera) cuando el contenido del ListView del fragment está desplazado hacia arriba. Sin embargo, estoy luchando para encontrar la manera de hacer que DecorView con el contenido.

¿Debo comunicar el estado de desplazamiento a la Activity , para luego pasarlo a ViewPager para desplazar el DecorView ? Se siente como si me falta algo allí.

También intenté usar CoordinatorLayout , pero parece que esto no funciona en la Activity / Fragment

Aquí está la fuente actual: https://github.com/fifersheep/android-sample-fixed-banner

Pero con el interés de no confiar en los enlaces, aquí hay una versión simplificada de lo que tengo en este momento:

MainActivity.kt

 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val pager = findViewById<ViewPager>(R.id.pager) pager.adapter = MainActivityPagerAdapter(supportFragmentManager) val tabLayout = findViewById<TabLayout>(R.id.tab_layout) tabLayout.setupWithViewPager(pager) } private inner class MainActivityPagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) { val titles = listOf("Fragment A", "Fragment B", "Fragment C") override fun getItem(position: Int): Fragment = CustomFragment.instance(titles[position]) override fun getPageTitle(position: Int): CharSequence = titles[position] override fun getCount(): Int = titles.size } } 

activity_main.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" tools:context="uk.lobsterdoodle.sample.fixedscrollingtablayoutbanner.MainActivity"> <android.support.design.widget.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabIndicatorColor="#fff" app:tabIndicatorHeight="2dp" app:tabMode="fixed" app:tabMaxWidth="0dp" app:tabGravity="fill" app:tabSelectedTextColor="#fff" app:tabTextColor="#6fff" android:background="@color/colorPrimaryDark" /> <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent"> <uk.lobsterdoodle.sample.fixedscrollingtablayoutbanner.BannerView android:id="@+id/static_header" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top"/> </android.support.v4.view.ViewPager> </LinearLayout> 

CustomFragment.kt

 class CustomFragment : Fragment() { private lateinit var adapter: ArrayAdapter<String> override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val view = inflater.inflate(R.layout.fragment_sample, container, false) adapter = ArrayAdapter(context, R.layout.my_list_item, (1..20).map { "${arguments.get("header")}: Item #$it" }) view.findViewById<ListView>(R.id.list_view).adapter = adapter return view } companion object { fun instance(header: String): Fragment { val frag = CustomFragment() val args = Bundle() args.putString("header", header) frag.arguments = args return frag } } } 

fragment_sample.xml

 <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/list_view" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" tools:listitem="@layout/my_list_item"/> </android.support.constraint.ConstraintLayout> 

BannerView.kt

 @ViewPager.DecorView class BannerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : FrameLayout(context, attrs, defStyleAttr) { init { inflate(context, R.layout.view_banner, this) } } 

my_list_item.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#eee"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="8dp" android:text="Simplification of banner layout"/> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#ddd" /> </LinearLayout> 

    Construye ViewPager personalizado para evitar el deslizamiento hacia la izquierda / derecha, solo muestra establece que cualquier movimiento del eje X se convierta en 0:

     class CustomViewPager : ViewPager { constructor(context: Context) : super(context) { } constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { } private fun transferXY(ev: MotionEvent): MotionEvent { //Prevent X movement val height = height.toFloat() ev.setLocation(0f, ev.y / width * height) return ev } override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { val intercepted = super.onInterceptTouchEvent(transferXY(ev)) transferXY(ev) return intercepted } override fun onTouchEvent(ev: MotionEvent): Boolean { return super.onTouchEvent(transferXY(ev)) } }