Tears_fg

导航

解决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) {
            }

        })

 

posted on 2022-08-03 14:33  Tears_fg  阅读(757)  评论(0编辑  收藏  举报