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

简介: Android: 解决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其他处理*/
}  
目录
相关文章
|
7月前
|
Android开发
Android 分享机顶盒项目的封装类《GridView》(二)(转)
Android 分享机顶盒项目的封装类《GridView》(二)(转)
50 2
|
6月前
|
API Android开发 开发者
`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView
【6月更文挑战第26天】`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView。它提供高效的数据视图复用,优化的布局管理,支持多种布局(如线性、网格),并解耦数据、适配器和视图。RecyclerView的灵活性、性能(如局部刷新和动画支持)和扩展性使其成为现代Android开发的首选,特别是在处理大规模数据集时。
72 2
|
6月前
|
前端开发 API Android开发
26. 【Android教程】网格视图 GridView
26. 【Android教程】网格视图 GridView
96 2
|
6月前
|
前端开发 API Android开发
25. 【Android教程】列表控件 ListView
25. 【Android教程】列表控件 ListView
219 2
|
6月前
|
Java API Android开发
22. 【Android教程】滚动条 ScrollView
22. 【Android教程】滚动条 ScrollView
111 2
|
7月前
|
XML Java Android开发
Android 分享机顶盒项目的封装类《GridView》(三)(转)
Android 分享机顶盒项目的封装类《GridView》(三)(转)
41 2
|
7月前
|
XML Java Android开发
如何美化android程序:自定义ListView背景
如何美化android程序:自定义ListView背景
70 2
|
7月前
|
Android开发
Android教程之Android 用户界面-表格视图(GridView)
Android教程之Android 用户界面-表格视图(GridView)
55 1