Android: 解决GridView、ListView在ScrollView中出现冲突的问题


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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值