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

简介: Android NestedScrollView/ScrollView包裹ViewPager自适应高度当Android的NestedScrollView/ScrollView这类滚动View包裹ViewPager时候,V...
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);
相关文章
|
6月前
|
XML Java Android开发
Android Studio App开发之翻页视图ViewPager的讲解及实战(附源码 包括翻页视图和翻页标签栏)
Android Studio App开发之翻页视图ViewPager的讲解及实战(附源码 包括翻页视图和翻页标签栏)
885 0
|
5月前
|
Android开发 容器
35. 【Android教程】视频页面:ViewPager
35. 【Android教程】视频页面:ViewPager
60 3
|
3月前
|
Android开发
Android使用ViewPager做无限轮播,人为滑动时停止
Android使用ViewPager做无限轮播,人为滑动时停止
77 2
|
5月前
|
Java API Android开发
22. 【Android教程】滚动条 ScrollView
22. 【Android教程】滚动条 ScrollView
104 2
|
5月前
|
编解码 Android开发
Android 解决TextView多行滑动与NestedScrollView嵌套滑动冲突的问题
Android 解决TextView多行滑动与NestedScrollView嵌套滑动冲突的问题
93 0
|
6月前
|
Android开发
Android使用ViewPager实现图片轮播系列之三:手动滑动 + 左右箭头(1)
Android使用ViewPager实现图片轮播系列之三:手动滑动 + 左右箭头(1)
|
Android开发
Android 使用ViewPager和自定义PagerAdapter实现轮播图效果
Android 使用ViewPager和自定义PagerAdapter实现轮播图效果
120 0
|
6月前
|
XML Java Android开发
Android Studio App开发之实现简单的启动引导页ViewPager(附源码 实现App的欢迎页面)
Android Studio App开发之实现简单的启动引导页ViewPager(附源码 实现App的欢迎页面)
755 1
|
数据处理 Android开发
关于安卓viewpager实现堆叠卡片交互
关于安卓viewpager实现堆叠卡片交互
327 1
|
Java Android开发
[笔记]Android 学习一之转场动画+ViewPager+ListView简单Demo
[笔记]Android 学习一之转场动画+ViewPager+ListView简单Demo