1.问题描述
在android中ScrollView是不能嵌套具有滑动特性的View的,eg: Gridview、ListView.
直接嵌套Gridview或ListView可能会出现的问题:
1)界面显示会出现只显示一行、最后一行显示不全等显示效果与预期不同,因为android禁止这样使用,放入ScrollView中的Gridview(或ListView)的高度是无法计算的。
2)嵌套中的子ListView和GridvIew是无法滑动的,因为子控件的滑动事件会被父ScrollView拦截,如果想让子控件可以滑动,只能强行的拦截滑动的相关事件(下面没有给出相关的事件处理方式,如果子view控件一定要滑动效果,必须单独处理事件)。
3)若ScrollView内还包含其他view,还有可能会出现-----进入页面会默认定位到Gridview(或ListView)的第一条……
2.解决方式
1)重写ListView或GridView,让其失去滑动特性。在重写的onMeasure()方法中加入如下代码即可:
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ int spec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, spec); }
2)经过验证,试了上面的方法,开始是ok的,但是后来就出现各种显示问题,还不如不用。键盘都快碎了,查找网上资料提供的各种方法都不管用,最后没办法了,将GridView的高度固定,若每个item中包含文字图片等不一样的资源,就要将图片等view的高度也要固定了,否则显示一片混乱(本人是通过固定view高度解决的此问题,其他的方案都无用)。其实很多问题都要具体问题具体分析,别人的解决方式不一定就适合你,毕竟每个人的代码环境和实现方式各有千秋。建议实际开发中,ScrollView不要嵌套GridView或ListView使用,真的是会出现很多很多问题。
3.示例代码
重写GridView:
/** *自定义不可滑动的GridView */ public class NoScrollGridView extends GridView{ public NoScrollGridView(Context context, AttributeSet attrs){ super(context, attrs); } /** *重写此方法是为了重画GridView: ScrollView中是不能嵌套具有滑动特性的View,为防止与scrollView一起使用时出现的冲突问题 */ public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ int spec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, spec); } /**以下部分可做view其他处理*/ }
重写ListView:
/** *自定义不可滑动的ListView */ public class NoScrollListView extends ListView{ public NoScrollListView(Context context, AttributeSet attrs){ super(context, attrs); } /** *重写此方法是为了重画GridView: ScrollView中是不能嵌套具有滑动特性的View,为防止与scrollView一起使用时出现的冲突问题 */ public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ int mSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec,mSpec); } /**以下部分可做view其他处理*/ }