@StevenZhang's solution almost worked for me, but there was a problem when the two tabs have different heights, the smaller tab takes the height of the larger tab.
Based on this answer on how to make ViewPager dynamic height I made a decision in Kotlin
Custom view pager
class CustomViewPager: ViewPager { constructor(context: Context) : super(context) constructor(context : Context, attrs : AttributeSet) : super(context, attrs) private var currentView : View? = null override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { currentView?.let { it.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)) val h = it.measuredHeight val height = if (h > 0) h else 0 val newHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY) super.onMeasure(widthMeasureSpec, newHeightMeasureSpec) return } super.onMeasure(widthMeasureSpec, heightMeasureSpec) } fun measureCurrentView(currentView: View?) { this.currentView = currentView requestLayout() } }
In custom PagerAdapter reassignment setPrimaryItem
override fun setPrimaryItem(container: ViewGroup, position: Int, 'object': Any) { super.setPrimaryItem(container, position, 'object') if (position != currentPosition) { val fragment = 'object' as Fragment val pager = container as CustomViewPager if (fragment.view != null) { currentPosition = position pager.measureCurrentView(fragment.view) } } }
You may also need to set the isNestedScrollingEnabled your RecyclerView to false
recyclerView.isNestedScrollingEnabled = false
source share