關(guān)于為什么只顯示一行,個(gè)人理解是:如果單獨(dú)使用GridView和ListView,里面的內(nèi)容是固定的,底層系統(tǒng)很容易計(jì)算出控件要占用的寬高,當(dāng)外面嵌套一層ScrollView后,就能做上下或左右滑動(dòng),但能滑動(dòng)多少系統(tǒng)不知道,這時(shí)就需要你給計(jì)算出一個(gè)滑動(dòng)區(qū)域給ScrollView。而這個(gè)數(shù)值就是通過(guò)GridView和ListView中的內(nèi)容總的寬高之和。有更精確的理解歡迎賜教。解決的辦法有兩種:
方法一:就是上面說(shuō)的通過(guò)計(jì)算出來(lái)ListView或者GridView中的子列高度和 進(jìn)行顯示:
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);
}
方法二:重寫(xiě)GridView和ListView的onMeasure方法,直接給它一個(gè)足夠大的高度:
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);
? }
}
重寫(xiě)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);
? ? ? }
}