根据Fragment布局高度来自动适应的Viewpager
2017-11-03 15:25
405 查看
在最近的项目中,要用到ViewPager,但是viewpager是放在recycleview里面,高度是不确定的,只好重写measure方法来根据子布局的高度来动态生成viewpager的高度,但是有个缺点,就是不能根据子布局的高度来收缩viewpager的高度,为了这个优化,在网上找了一个多小时,终于找到个方法,下面直接贴使用的方法:
1.将自定义viewpager放进自己的项目
package com.plyou.leintegration.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 java.util.HashMap;
import java.util.LinkedHashMap;
/**
* Created by admin on 2017/10/25.
*/
public class CustomViewPager 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 CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mChildrenViews.size() > current) {
View child = mChildrenViews.get(current);
if (child != null) {
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) {
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams();
if (layoutParams == null) {
layoutParams = new LinearLayout.LayoutParams(LinearLayout.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;
}
}
2.在fragemnt的oncreatview里面调用viewpager方法
3.每次滑动viewpager重新设置高度
好了,大致完成,直接看下效果吧
1.将自定义viewpager放进自己的项目
package com.plyou.leintegration.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 java.util.HashMap;
import java.util.LinkedHashMap;
/**
* Created by admin on 2017/10/25.
*/
public class CustomViewPager 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 CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mChildrenViews.size() > current) {
View child = mChildrenViews.get(current);
if (child != null) {
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) {
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams();
if (layoutParams == null) {
layoutParams = new LinearLayout.LayoutParams(LinearLayout.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;
}
}
2.在fragemnt的oncreatview里面调用viewpager方法
3.每次滑动viewpager重新设置高度
好了,大致完成,直接看下效果吧
相关文章推荐
- 根据Fragment布局高度来自动适应的Viewpager
- ViewPager+Fragment ViewPager适应Fragment高度
- scrollview里面嵌套viewpager高度自动适应
- iOS-textView文本换行高度自动适应
- Fragment为载体可自动布局的CardView(GitHub上写开源项目初体验)
- 【安卓-自定义布局】安卓App开发思路 一步一个脚印(七)实现ViewPager无限循环与自动播放
- IOS TableView的Cell高度自适应,UILabel自动换行适应
- 根据文字的个数,label自动适应高度
- [转]让UITableView中的单元格根据内容的多少自动调整高度
- Android布局为,Fragment,ScrollView,Viewpager切换焦点问题
- Android流行UI布局——底部导航(BottomNavigationView+ViewPager+Fragment)
- 解决在scrollview中的viewpager高度自适应的问题
- ViewPager+Fragment+RecyclerView,当切换viewpager时,recyclerview自动向上滑动问题
- IOS TableView的Cell高度自适应,UILabel自动换行适应
- 关于Fragment中viewpager的子fragment不能加载布局的问题
- 仿 今日头条布局:TabLayout+ViewPager+Fragment+ListView多条目加载+Webview
- Fragment为载体可自动布局的CardView(GitHub上写开源项目初体验)
- Android流行UI布局 BottomNavigationView+ViewPager+Fragment的使用
- 实现Fragment的切换和ViewPager自动循环设置切换时间
- UITableView中Lable自动换行,Cell自动适应高度