ScrollView中嵌套GridView,ListView只顯示一行的解決辦法

關(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è)足夠大的高度:

重寫(xiě)ListView:


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);

? ? ? }

}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容