NestedScrollView里嵌套ViewPager+fragment高度不适配问题

最近项目中遇到ScrollView嵌套ViewPager,ViewPager中存放的是ImagView,要求是,ImagView高度不定,接下来就是各种方法尝试,比较普遍的方式就是自定义一个viewpager。代码如下:
 
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.View;
 
/**
 * 自动适应高度的ViewPager
 * @author
 *
 */
public class CustomViewPager extends ViewPager {
 
   public CustomViewPager(Context context) {
      super(context);
   }
 
   public CustomViewPager(Context context, AttributeSet attrs) {
      super(context, attrs);
   }
 
   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 
      int height = 0;
      for (int i = 0; i < getChildCount(); i++) {
         View child = getChildAt(i);
         child.measure(widthMeasureSpec, View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
         int h = child.getMeasuredHeight();
         if (h > height)
            height = h;
      }
 
      heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY);
 
      super.onMeasure(widthMeasureSpec, heightMeasureSpec);
   }
}
可以看出,此自定义ViewPager的高度是根据子view的高度来决定的, if (h > height)
            height = h;循环过后,就是将高度最大的子view的高度赋值给ViewPager的高度,这样可以解决ViewPager不显示的问题,但是潜在的问题是,当view的高度小的时候,ViewPager中的view下面会留白。
            不符合需求,而且不美观。
            接下来在csdn中找到如下自定义的ViewPager:
方式一:ViewPager中放的是View
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
 
import java.util.HashMap;
import java.util.LinkedHashMap;
 
/**
 * Created by lzq 
 */
public class SignViewPager extends ViewPager{
    private int current;
    private int height = 0;
    /**
     * 保存position与对于的View
     */
    private HashMap mChildrenViews = new LinkedHashMap();
 
    private boolean scrollble = true;
 
    public SignViewPager(Context context) {
        super(context);
    }
 
    public SignViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
 
 
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (mChildrenViews.size() > current) {
            View child = mChildrenViews.get(current);
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            height = child.getMeasuredHeight();
        }
 
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
 
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
 
 public void resetHeight(int current) { this.current = current; if (mChildrenViews.size() > current) { ViewGroup.LayoutParams layoutParams = (ViewGroup.LayoutParams) getLayoutParams(); if (layoutParams == null) { layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height); } else { layoutParams.height = height; } setLayoutParams(layoutParams); } }
    /**
     * 保存position与对于的View
     */
    public void setObjectForPosition(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;
    }
 
}
接下来需要注意的是: 这个写在activity里
        条件1:
        pager.setOffscreenPageLimit(3);
        条件2:
        pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
 
            }
            @Override
            public void onPageSelected(int position) {
                pager.resetHeight(position);//重置viewpager的高度
                //num.setText((position+1)+"/"+imageInfo.size());
                pager.resetHeight(0);  
 }
@Overridepublic void onPageScrollStateChanged(int state) {}});
条件3:在instantiateItem()方法中pager.setObjectForPosition(view1,position);setObjectForPosition方法是为了调用存放你的view和他对应的position这样就完美解决了。
方式二:ViewPager中放Fragment
条件1:
setObjectForPosition()方法中是为了调用存放你的view和他对应的position,这个是参考了鸿洋大神的一篇文章,链接:http://blog.csdn.net/lmj623565791/article/details/38026503
,为了防止预加载导致的高度不匹配,我们加自身的fragment和position对应起来放在linkedmap里。  
好了,剩下的就是调用vp.setObjectForPosition(view,1); 
setObjectForPosition()这个方法了,请看我的一个SecurityInfoFragment
public SecurityInfoFragment(CustomViewpager pager) {  //CustomViewpager 的引用传到Fragment中,用来调用
        this.pager = pager;  
    }  
  
  
    @Nullable  
    @Override  
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {  
        View view = inflater.inflate(R.layout.fg_sc_filght_info, null);  
        
    pager.setObjectForPosition(view,1);  
        return view;  
    } 
条件2:
pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {  
            @Override  
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {  
  
            }  
  
            @Override  
            public void onPageSelected(int position) {  
                activityScdetailsBottomVp.resetHeight(position);  
            }  
            @Override  
            public void onPageScrollStateChanged(int state) {  
  
            }  
        });  
        pager.resetHeight(0);  //默认设置第0个页面或view高度,当滑动的时候setOnPageChangeListener调 //activityScdetailsBottomVp.resetHeight(position);  
  
  
    }  
 
 
 

你可能感兴趣的:(基础知识)