http://blog.csdn.net/yoyo_newbie/article/details/47167933
第二步,隐藏头部文件headerview,对于菜鸟来说这一步很关键。
原理是通过设置他的marginTop的总高度的负数来隐藏它。然而我们通过直接调用
view.getMeasuredHeight()
直接获取的高度为0!所以就要解决这个问题。我们可以通过通知父布局测量总高度即可、如下
/** * 测量view的真实高度,并返回 */ private int measureView(View view) { LinearLayout.LayoutParams params = (LayoutParams) view.getLayoutParams(); int width = LinearLayout.getChildMeasureSpec(0, 0, params.width); int tempHeight = params.height; int height = tempHeight>0? MeasureSpec.makeMeasureSpec(tempHeight, MeasureSpec.EXACTLY): MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); view.measure(width, height); return view.getMeasuredHeight(); }其中部分知识我就不多讲了,自己去查,一时半刻是无法解析的,比较抽象,需要自己动手理解,自己动手吧骚年。
然后我们定义一个高度变量,隐藏头部文件的方法和设置headerView的marginTop的方法
/** * 头部文件的高度 */ private int headerViewHeight; /** * 隐藏headerView */ private void hideHeaderView() { //设置margintop为负数的总高度可以直接隐藏它 setHeaderViewMarginTop(-headerViewHeight); }
/** * 设置头部文件magrintop */ private void setHeaderViewMarginTop(int top) { LinearLayout.LayoutParams params = (LayoutParams) heanderView.getLayoutParams(); params.setMargins(0,top, 0, 0); heanderView.setLayoutParams(params); }
于是我们就完成了隐藏headerview这个方法。
拼接后的代码。如下
/** *带gif下拉 * @author Sam */ public abstract class BaseGifRefresh<V extends View> extends LinearLayout { /** * 内容部分 */ private V childerView; /** * 实现内容部分 * @param context * @return */ protected abstract V getConvertView(Context context); public BaseGifRefresh(Context context, AttributeSet attrs) { super(context, attrs); init(context); } /** * 刷新时候,显示的头部 */ private View heanderView; /** * 初始化ui * @param context */ private void init(Context context) { //设置垂直布局 setOrientation(LinearLayout.VERTICAL); //添加头部 heanderView = newHeaderView(context); addView(heanderView); //添加内容部分 childerView = newChildView(context); addView(childerView); //第二步,获取头部高度, 隐藏headerview //获取头部的高度 //直接获取view的高度的话,结果为0.所以要先测量出头部的高度 headerViewHeight = measureView(heanderView); //隐藏headerView hideHeaderView(); } /** * 头部文件的高度 */ private int headerViewHeight; /** * 隐藏headerView */ private void hideHeaderView() { //设置margintop为负数的总高度可以直接隐藏它 setHeaderViewMarginTop(-headerViewHeight); } /** * 设置头部文件magrintop */ private void setHeaderViewMarginTop(int top) { LinearLayout.LayoutParams params = (LayoutParams) heanderView.getLayoutParams(); params.setMargins(0,top, 0, 0); heanderView.setLayoutParams(params); } /** * 构造一个头部header * @param context * @return */ private View newHeaderView(Context context) { View heanderView = LayoutInflater.from(context).inflate(R.layout.refresh_list_header,null); LinearLayout.LayoutParams headerViewParams = new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); heanderView.setLayoutParams(headerViewParams); return heanderView; } /** * 构件内容部分 * @param context * @return */ private V newChildView(Context context) { LinearLayout.LayoutParams convertViewParams = new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); convertViewParams.weight = 1; V childView = getConvertView(context); childView.setBackgroundColor(Color.RED);//TODO 为了看效果,测试一下 childView.setLayoutParams(convertViewParams); return childView; } /** * 测量view的真实高度,并返回 */ private int measureView(View view) { LinearLayout.LayoutParams params = (LayoutParams) view.getLayoutParams(); int width = LinearLayout.getChildMeasureSpec(0, 0, params.width); int tempHeight = params.height; int height = tempHeight>0? MeasureSpec.makeMeasureSpec(tempHeight, MeasureSpec.EXACTLY): MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); view.measure(width, height); return view.getMeasuredHeight(); } }效果图:
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/yoyo_newbie/article/details/47168873