首页 > 代码库 > AutoFollowBox
AutoFollowBox
如果你有个Button或者view希望跟随Listview,GridView,并且要求adapter高度自适应,达到自动跟随的效果,那这个是个不错的方法
标签: Android
[1].[文件] AutoFollowBox.java ~ 4KB 下载(8) 跳至 [1]
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | package com.phodev.andtools.widget; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; /** * 由于ListView,Gridiew,等高度设置为wrap_content的时候会有问题,如果此时下面还有其他view, * 当AdapterView的item很多的上海,不仅scroll有问题,底部跟随的view也会跑到可是范围外 * * <pre> * <com.phodev.widgets.AutoFollowBox> * <ListView * android:layout_width="fill_parent" * android:layout_height="wrap_content"// 必须是wrap content,否则没有必要使用该组建,直接布局即可 * /> * <OtherView/>//有切只有有一个OtherView如果底部是多个View,可以放到一个布局里面。总是AutoFollowBox有切职能有两个Child * <com.phodev.widgets.AutoFollowBox/> * </pre> * * @author sky * */ public class AutoFollowBox extends ViewGroup { public AutoFollowBox(Context context, AttributeSet attrs) { super (context, attrs); } public AutoFollowBox(Context context) { super (context); } private Rect marginInfo = new Rect(); @Override protected void onLayout( boolean changed, int l, int t, int r, int b) { int childCount = getChildCount(); int maxW = r - l; int cl, ct, cr, cb; int heightOffset = 0 ; for ( int i = 0 ; i < childCount; i++) { View v = getChildAt(i); getMargingInfo(v, marginInfo); cl = marginInfo.left; ct = marginInfo.top + heightOffset; cr = maxW - marginInfo.right; cb = ct + v.getMeasuredHeight(); v.layout(cl, ct, cr, cb); heightOffset = cb + marginInfo.bottom; } } @Override protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec) { int childCount = getChildCount(); if (childCount != 2 ) { throw new RuntimeException( "mast only 2 views is AutoFoolowAdapterViewBox" ); } // View stretchView = getChildAt( 0 ); View followView = getChildAt( 1 ); // start measure int offsetBottom = 0 ; int followViewHeihgt = 0 ; if (followView.getVisibility() == View.VISIBLE) { LayoutParams lp = followView.getLayoutParams(); measureChildWithMargins(followView, widthMeasureSpec, 0 , heightMeasureSpec, 0 ); followViewHeihgt = followView.getMeasuredHeight(); if (lp instanceof MarginLayoutParams) { MarginLayoutParams mlp = (MarginLayoutParams) lp; offsetBottom = mlp.topMargin + mlp.bottomMargin + followViewHeihgt; } } // if (stretchView.getVisibility() == View.VISIBLE) { measureChildWithMargins(stretchView, widthMeasureSpec, 0 , heightMeasureSpec, offsetBottom); } // int maxWantWitdh = Math.max(getMeasuerWidthWithMarging(followView), getMeasuerWidthWithMarging(stretchView)); int maxWantHeight = getMeasuerHeightWithMarging(stretchView) + getMeasuerHeightWithMarging(followView); // int measuredWidth = resolveSize(maxWantWitdh, widthMeasureSpec); int measuredHeight = resolveSize(maxWantHeight, heightMeasureSpec); setMeasuredDimension(measuredWidth, measuredHeight); } private int getMeasuerHeightWithMarging(View v) { LayoutParams lp = v.getLayoutParams(); int hAdd = 0 ; if (lp instanceof MarginLayoutParams) { MarginLayoutParams mlp = (MarginLayoutParams) lp; hAdd = mlp.topMargin + mlp.bottomMargin; } return v.getMeasuredHeight() + hAdd; } private int getMeasuerWidthWithMarging(View v) { LayoutParams lp = v.getLayoutParams(); int wAdd = 0 ; if (lp instanceof MarginLayoutParams) { MarginLayoutParams mlp = (MarginLayoutParams) lp; wAdd = mlp.leftMargin + mlp.rightMargin; } return v.getMeasuredWidth() + wAdd; } private void getMargingInfo(View v, Rect out) { if (v != null && v.getLayoutParams() instanceof MarginLayoutParams) { MarginLayoutParams mlp = (MarginLayoutParams) v.getLayoutParams(); // out.set(mlp.leftMargin, // mlp.topMargin, // mlp.rightMargin, // mlp.bottomMargin); } else { out.set( 0 , 0 , 0 , 0 ); } } @Override protected LayoutParams generateDefaultLayoutParams() { return new MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); } @Override public LayoutParams generateLayoutParams(AttributeSet attrs) { return new MarginLayoutParams(getContext(), attrs); } } |
AutoFollowBox
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。