在scrollview中嵌套listview或者gridview时

如果listview或者gridview的高度时wrap-content会导致两者只显示一行多一点


原因:

listview和gridview都继承于scrollview 两个scrollview嵌套会导致高度有问题。



核心解决方案:

重写listview和gridview的onMeasure方法 如下:

packagecome.cake.customview;importandroid.content.Context;importandroid.util.AttributeSet;importandroid.view.MotionEvent;importandroid.widget.ListView;/***Createdbyappleon16/1/20.*/publicclassMyListViewextendsListView{publicMyListView(Contextcontext,AttributeSetattrs){super(context,attrs);}publicMyListView(Contextcontext){super(context);}publicMyListView(Contextcontext,AttributeSetattrs,intdefStyle){super(context,attrs,defStyle);}protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){intexpandSpec=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec,expandSpec);}@OverridepublicbooleandispatchTouchEvent(MotionEventev){if(ev.getAction()==MotionEvent.ACTION_MOVE){returntrue;//禁止listview进行滑动}returnsuper.dispatchTouchEvent(ev);}}



packagecome.cake.customview;importandroid.content.Context;importandroid.util.AttributeSet;importandroid.view.MotionEvent;importandroid.widget.GridView;publicclassMyGridViewextendsGridView{publicMyGridView(Contextcontext,AttributeSetattrs){super(context,attrs);}publicMyGridView(Contextcontext){super(context);}publicMyGridView(Contextcontext,AttributeSetattrs,intdefStyle){super(context,attrs,defStyle);}@OverridepublicbooleandispatchTouchEvent(MotionEventev){if(ev.getAction()==MotionEvent.ACTION_MOVE){returntrue;//禁止Gridview进行滑动}returnsuper.dispatchTouchEvent(ev);}@OverrideprotectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){intexpandSpec=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec,expandSpec);}}gridView.setFocusable(false);//scrollview内部嵌套gridview防止从底部显示,加上这行代码就会从头部显示