您现在的位置是:首页 > 文章详情

Android NestedScrollView/ScrollView包裹ViewPager自适应高度

日期:2018-05-11点击:564
Android NestedScrollView/ScrollView包裹ViewPager自适应高度

当Android的NestedScrollView/ScrollView这类滚动View包裹ViewPager时候,ViewPager中的Fragment包含的又是一系列高度值不固定的View如RecyclerView等等,就会造成ViewPager高度无法自适应子Fragment里面的View的高度,解决方法其中之一就是重新改造ViewPager,让其能自动适应子Fragment里面的View高度,改造后的AutofitHeightViewPager:
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;

import java.util.HashMap;
import java.util.LinkedHashMap;

public class AutofitHeightViewPager extends ViewPager {
    public static final String POSITION = "position";

    private int mCurPosition;
    private int mHeight = 0;

    private HashMap<Integer, View> mChildrenViews = new LinkedHashMap<Integer, View>();

    private boolean scrollble = true;

    public AutofitHeightViewPager(Context context) {
        super(context);
    }

    public AutofitHeightViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (mChildrenViews.size() > mCurPosition) {
            View child = mChildrenViews.get(mCurPosition);
            if (child != null) {
                child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
                mHeight = child.getMeasuredHeight();
            }
        }

        if (mHeight != 0) {
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(mHeight, MeasureSpec.EXACTLY);
        }

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    public void updateHeight(int current) {
        this.mCurPosition = current;
        if (mChildrenViews.size() > current) {
            ViewGroup.LayoutParams layoutParams = getLayoutParams();
            if (layoutParams == null) {
                layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, mHeight);
            } else {
                layoutParams.height = mHeight;
            }

            setLayoutParams(layoutParams);
        }
    }

    public void setViewPosition(View view, int position) {
        mChildrenViews.put(position, view);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (!scrollble) {
            return true;
        }
        return super.onTouchEvent(ev);
    }

    public boolean isScrollble() {
        return scrollble;
    }

    public void setScrollble(boolean scrollble) {
        this.scrollble = scrollble;
    }
}

自适应高度的ViewPager思路是每一次切换时候,重新设置ViewPager的高度值。
使用方法有四点必须实现:
1,先把AutofitHeightViewPager像Android原生的ViewPager一样写进xml布局。
2,在上层Java代码的mViewPager添加的切换事件addOnPageChangeListener里面每次updateHeight,例如:
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                mViewPager.updateHeight(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

3,构建mViewPager肯定要设置FragmentPagerAdapter,在把创建Fragment喂给FragmentPagerAdapter时候,给Fragment把当前Fragment位置position设置进去,例如:

        Fragment xxxFragment = new XXXFragment();
        Bundle xxxBunle = new Bundle();
        xxxBunle.putInt(AutofitHeightViewPager.POSITION, 1); //1为当前位置,这里的位置索引即为要传递的值,不同的Fragment按照先后添加顺序添加和传递索引
        xxxFragment.setArguments(xxxBunle);
        mPagerAdapter.addFragment(xxxFragment)

4,然后转入到具体的XXXFragment里面,把当前XXXFragment创建的View高度传回给AutofitHeightViewPager,一般是在onCreateView:
        int pos = getArguments().getInt(AutofitHeightViewPager.POSITION);
        (强制转换为ViewPager所在的Activity) getActivity()).mViewPager.setViewPosition(view, pos);
原文链接:https://yq.aliyun.com/articles/615667
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章