Android: 解决GridView、ListView在ScrollView中出现冲突的问题 ——诺诺"涂鸦"记忆

来源:互联网 发布:程序员考试下午真题 编辑:程序博客网 时间:2024/05/16 17:38


----------   诺诺学习技术交流博客、期待与您交流!    ----------

详情请查看:http://blog.csdn.net/sun_promise

解决GridView、ListView在ScrollView中出现显示异常的问题


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其他处理*/}  




----------   诺诺学习技术交流博客、期待与您交流!    ----------

详情请查看:http://blog.csdn.net/sun_promise


0 0