最近项目中遇到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<Integer, View> mChildrenViews = new LinkedHashMap<Integer, View>();
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) {
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) getLayoutParams();
if (layoutParams == null) {
layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.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;
}
}
接下来需要注意的是:
条件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);
}
ScrollView嵌套ViewPager自适应高度,图片高度小的会显示空白
最新推荐文章于 2024-07-16 03:30:34 发布