關于為什么只顯示一行芹壕,個人理解是:如果單獨使用GridView和ListView,里面的內容是固定的接奈,底層系統(tǒng)很容易計算出控件要占用的寬高踢涌,當外面嵌套一層ScrollView后,就能做上下或左右滑動序宦,但能滑動多少系統(tǒng)不知道睁壁,這時就需要你給計算出一個滑動區(qū)域給ScrollView。而這個數值就是通過GridView和ListView中的內容總的寬高之和互捌。有更精確的理解歡迎賜教潘明。解決的辦法有兩種:
方法一:就是上面說的通過計算出來ListView或者GridView中的子列高度和 進行顯示:
public void setListViewHeightBasedOnChildren(ListView listView) {
? ? ? ? ? ?ListAdapter listAdapter = listView.getAdapter();
? ? ? ? ? if(listAdapter ==null) {
? ? ? ? ?return;
? ? ? ? ?}
? ? ? ? inttotalHeight =0;
? ? ? ?for(inti =0;i < listAdapter.getCount();i++) {
? ? ? View listItem = listAdapter.getView(i,null,listView);
? ? ? ?listItem.measure(0,0);
? ? ? ?totalHeight += listItem.getMeasuredHeight();
? ? ? }
? ? ?ViewGroup.LayoutParams params = listView.getLayoutParams();
? ? ?params.height= totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() -1));
? ? ?((MarginLayoutParams)params).setMargins(15,15,15,15);
? ? ?listView.setLayoutParams(params);
}
方法二:重寫GridView和ListView的onMeasure方法,直接給它一個足夠大的高度:
public class MyListView extends ListView?{
? ? ? ? ?public MyListView(Context?context)?{
? ? ? ? //?TODO?Auto-generated?method?stub
? ? ? ?super(context);
? ? ? }
? ? ?public MyListView(Context?context,?AttributeSet?attrs)?{
? ? ?//?TODO?Auto-generated?method?stub
? ? super(context,?attrs);
? ?}
? ?public MyListView(Context?context,?AttributeSet?attrs,intdefStyle)?{
? ?//?TODO?Auto-generated?method?stub
? ? super(context,?attrs,?defStyle);
? ?}
? ?@Override
? ?protected void onMeasure(intwidthMeasureSpec,intheightMeasureSpec)?{
? ?//?TODO?Auto-generated?method?stub
? ?intexpandSpec?=?MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE?>>2,
? ?MeasureSpec.AT_MOST);
? ?super.onMeasure(widthMeasureSpec,?expandSpec);
? }
}
重寫GridView:
public class MyGridView extends GridView {
? ? ?public MyGridView(Context context,AttributeSet attrs) {
? ? ?super(context,attrs);
? ? }
? ? public MyGridView(Context context) {
? ? super(context);
? ?}
? ?public MyGridView(Context context,AttributeSet attrs, intdefStyle) {
? ?super(context,attrs,defStyle);
? ? }
? ?@Override
? ? ?public voidonMeasure(intwidthMeasureSpec, intheightMeasureSpec) {
? ? ?intexpandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,
? ?MeasureSpec.AT_MOST);
? ?super.onMeasure(widthMeasureSpec,expandSpec);
? ? ? }
}