如果把GridView放到一个垂直方向滚动的布局中,设置其高度属性为 wrap_content ,则该GridView的高度只有一行内容,其他内容通过滚动来显示。 如果你想让该GridView的高度为所有行内容所占用的实际高度,则可以通过覆写GridView的 onMeasure 函数来修改布局参数:
Java代码
|
package
com.jayway.components;
import
android.content.Context;
import
android.util.AttributeSet;
import
android.widget.GridView;
public
class
MyGridView
extends
GridView {
public
MyGridView(Context context) {
super
(context);
}
public
MyGridView(Context context, AttributeSet attrs) {
super
(context, attrs);
}
public
MyGridView(Context context, AttributeSet attrs,
int
defStyle) {
super
(context, attrs, defStyle);
}
@Override
protected
void
onMeasure(
int
widthMeasureSpec,
int
heightMeasureSpec) {
int
heightSpec;
if
(getLayoutParams().height == LayoutParams.WRAP_CONTENT) {
// The great Android "hackatlon", the love, the magic.
// The two leftmost bits in the height measure spec have
// a special meaning, hence we can't use them to describe height.
heightSpec = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >>
2
, MeasureSpec.AT_MOST);
}
else
{
// Any other height should be respected as is.
heightSpec = heightMeasureSpec;
}
super
.onMeasure(widthMeasureSpec, heightSpec);
}
}
|
activity_main.xml
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
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
ScrollView
xmlns:android
=
"http://schemas.android.com/apk/res/android"
android:layout_width
=
"match_parent"
android:layout_height
=
"match_parent"
>
<
LinearLayout
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:orientation
=
"vertical"
>
<!-- Header One -->
<
TextView
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:focusable
=
"true"
android:text
=
"Header 1"
/>
<!-- Custom grid view holding the 'Group 1' items -->
<
com.jayway.components.MyGridView
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:numColumns
=
"3"
android:stretchMode
=
"columnWidth"
android:id
=
"@+id/grid_view_1"
/>
<!-- Header 2 -->
<
TextView
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:text
=
"Header 2"
/>
<!-- Custom grid view holding the 'Group 2' items -->
<
com.jayway.components.MyGridView
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:numColumns
=
"3"
android:stretchMode
=
"columnWidth"
android:id
=
"@+id/grid_view_2"
/>
</
LinearLayout
>
</
ScrollView
>
|
MainActivity.java
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
|
package
com.jayway.app;
import
java.util.ArrayList;
import
android.os.Bundle;
import
android.widget.ArrayAdapter;
import
android.app.Activity;
import
com.jayway.components.MyGridView;
public
class
MainActivity
extends
Activity {
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList labels =
new
ArrayList();
for
(
int
i =
0
; i <
24
; i++) {
labels.add(
"Item "
+ i);
}
ArrayAdapter adapter =
new
ArrayAdapter(
this
, android.R.layout.simple_list_item_1, labels);
MyGridView grid1 = (MyGridView) findViewById(R.id.grid_view_1);
grid1.setAdapter(adapter);
MyGridView grid2 = (MyGridView) findViewById(R.id.grid_view_2);
grid2.setAdapter(adapter);
}
}
|