ViewPaper2的高度是按照第一个Fragment的高度定死的,所以需要ViewPaper2中每个Fragment都自适应高度
解决方式:
mBinding.viewPager.registerOnPageChangeCallback(object: OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
updateHeight(position)
}
})
new TabLayoutMediator(TabLayout, ViewPager2, new TabLayoutMediator.TabConfigurationStrategy() {
@Override
public void onConfigureTab(@NonNull @NotNull TabLayout.Tab tab, int position) {
updateHeight(position);
}
}).attach();
fun updateHeight(position: Int) {
if (mFragments.size > position) {
val fragment: Fragment = mFragments.get(position)
if (fragment.view != null) {
val viewWidth = View.MeasureSpec.makeMeasureSpec(
fragment.view!!.width, View.MeasureSpec.EXACTLY
)
val viewHeight = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
fragment.view!!.measure(viewWidth, viewHeight)
if (mBinding.viewPager.getLayoutParams().height != fragment.view!!.measuredHeight) {
//必须要用对象去接收,然后修改该对象再采用该对象,否则无法生效...
val layoutParams: ViewGroup.LayoutParams = mBinding.viewPager.getLayoutParams()
layoutParams.height = fragment.view!!.measuredHeight
mBinding.viewPager.setLayoutParams(layoutParams)
}
}
}
}
解决过程中出现的问题
问题1:RecyclerView列表顶部出现莫名空白部分
原因:ViewPager2里加载的Fragment xml布局里有android:fitsSystemWindows="true"导致
解决:去掉android:fitsSystemWindows=“true”
问题2:首次进入页面出现第一个Fragment被裁切布局,显示不全
原因:接口数据返回较慢,已经进入该页面时首个Fragment已初始化完毕造成裁切问题
解决:接口请求完成数据适配完成后再调用updateHeight()