如果你有个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);
}
}
|