解决NestedScrollView+TabLayout+ViewPager2+Fragment+RecyclerView高度自适应问题(裁切)

  • Post author:
  • Post category:其他




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()


参考链接



版权声明:本文为wanglei118923原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。