解决viewpager嵌套fragment布局高度问题
需求:
scrollview嵌套viewpager,实现viewpager下的子页面的高度显示
遇到的问题:
一、viewpager下的子布局默认占满整个屏幕
解决方式:
自定义viewpager,重写onMeasure方法,每次滑动到新的pager时,调用viewpager的requestLayout()使布局重绘。
public class WrapContentHeightViewPager extends ViewPager { public WrapContentHeightViewPager(Context context) { super(context); } public WrapContentHeightViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int currentItem = getCurrentItem(); View child = getChildAt(currentItem); child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); //使viewpager的高度为最高子布局的高度 // int height = 0; // for (int i = 0; i < getChildCount(); i++) { // View child = getChildAt(i); // child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); // int h = child.getMeasuredHeight(); // if (h > height) height = h; // } heightMeasureSpec = MeasureSpec.makeMeasureSpec( child.getMeasuredHeight(), MeasureSpec.EXACTLY); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }
通过上面的代码可以使得viewpager每次切换的时候,动态的变化它的高度。
但是新的问题诞生了,当viewpager从1000dp的高度滑动到300dp,再滑动回去,会出现白屏。推断是之前布局被截断导致。
问题二:页面出现白屏
解决方式:
在页面切换的时候重新刷新子布局。(子布局为recyclerview,直接刷新适配器)
binding.vpCoin.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrolled( position: Int, positionOffset: Float, positionOffsetPixels: Int ) { } @SuppressLint("NotifyDataSetChanged") override fun onPageSelected(position: Int) { mCurrentTab = position binding.tabLayout.currentTab = position reportEventByPos(position) binding.vpCoin.requestLayout() binding.vpCoin.post { //刷新内层rvCoin val rvCoinRankingList = binding.vpCoin.getChildAt(position).findViewById<RecyclerView>(R.id.rvCoinRankingList) rvCoinRankingList?.adapter?.notifyDataSetChanged() } } override fun onPageScrollStateChanged(state: Int) { } })