解决ScrollView中嵌套ListView或GridView导致的ScrollView自动滚动到ListView或GridView位置的问题
2017-05-16 15:32
621 查看
问题背景:在项目中,要求在App首页中加入用户收藏内容的列表(ListView)和网格(GridView)视图展示。因首页顶部还含有广告轮播和控制收藏内容显示和隐藏的按钮,所以,考虑用ScrollView中嵌套ListView和GridView的方式进行布局。如图:
问题描述:
1).当点击“显示按钮”显示或隐藏ListView/GridView时,若ScrollView中的内容不足以在整个手机屏幕中显示(即ListView/GridView中的内容大于布局中显示的范围),则,ListView/GridView由隐藏(GONE)变为可视(VISIBLE),ListView/GridView会自动顶到ScrollView顶端。
2).当点击底部Tab切换至其他Fragment页面(Fragment+ViewPager实现的页面切换),再切换回“首页”。若ScrollView中的内容不足以在整个手机屏幕中显示(即ListView/GridView中的内容大于布局中显示的范围),则,未切换前,原本显示的广告轮播图和“我的收藏”栏,在切换回来后,ListView/GridView会自动顶到ScrollView顶端。
产生原因:ListView/GridView自动获取焦点,导致ListView/GridView会自动顶到ScrollView顶端。
解决办法:
1).自定义ListView和GridView
2)添加descendantFocusability属性
在ScrollView的根布局LinearLayout中添加android:descendantFocusability="blocksDescendants"属性,使ListView/GridView不能获取到焦点。
descendantFocusability有三种属性
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
此外,在我查找资料时,还有一位博友提供了另外一种简单的解决办法,在这里我就不详细说了,有兴趣的朋友可以点击链接去查看参考:
http://blog.csdn.net/cutelittlebo/article/details/49251691
问题描述:
1).当点击“显示按钮”显示或隐藏ListView/GridView时,若ScrollView中的内容不足以在整个手机屏幕中显示(即ListView/GridView中的内容大于布局中显示的范围),则,ListView/GridView由隐藏(GONE)变为可视(VISIBLE),ListView/GridView会自动顶到ScrollView顶端。
2).当点击底部Tab切换至其他Fragment页面(Fragment+ViewPager实现的页面切换),再切换回“首页”。若ScrollView中的内容不足以在整个手机屏幕中显示(即ListView/GridView中的内容大于布局中显示的范围),则,未切换前,原本显示的广告轮播图和“我的收藏”栏,在切换回来后,ListView/GridView会自动顶到ScrollView顶端。
产生原因:ListView/GridView自动获取焦点,导致ListView/GridView会自动顶到ScrollView顶端。
解决办法:
1).自定义ListView和GridView
public class ListViewForScrollView extends ListView { public ListViewForScrollView(Context context) { super(context); } public ListViewForScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public ListViewForScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override /** * 重写该方法,达到使ListView适应ScrollView的效果,GridView类似 */ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }
2)添加descendantFocusability属性
在ScrollView的根布局LinearLayout中添加android:descendantFocusability="blocksDescendants"属性,使ListView/GridView不能获取到焦点。
descendantFocusability有三种属性
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
此外,在我查找资料时,还有一位博友提供了另外一种简单的解决办法,在这里我就不详细说了,有兴趣的朋友可以点击链接去查看参考:
http://blog.csdn.net/cutelittlebo/article/details/49251691
相关文章推荐
- ScrollView嵌套ListView,GridView,ViewPager,以及这些控件自动滚动到底部问题的解决
- ScrollView嵌套ListView,GridView,ViewPager,以及这些控件自动滚动到底部问题的解决
- ScrollView嵌套ListView,GridView,ViewPager,以及这些控件自动滚动到底部问题的解决
- ScrollView嵌套ListView,GridView,ViewPager,以及这些控件自动滚动到底部问题的解决
- ScrollView嵌套ListView,GridView,ViewPager,以及这些控件自动滚动到底部问题的解决
- 解决ScrollView嵌套ListView,ListView填充容器后,界面自动滚动回顶部的问题
- ScrollView嵌套GridView,ListView自动滚动到第一条Item的解决办法
- ScrollView中嵌套了Listview或者Gridview导致的界面加载起始位置不在顶部的问题
- 解决GridView,ListView嵌套在ScrollView时只显示一行高度的问题
- 解决ScrollView中嵌套ListView滚动效果冲突问题
- 解决ScrollView下嵌套ListView、GridView显示不全的问题
- 解决ScrollView跟ListView或GridView嵌套时的问题
- Android ScrollView与ListView一起(嵌套)使用解决ListView自动滚动的几点方案
- 解决scrollview 嵌套gridview或者listview 冲突的问题
- ScrollView 嵌套GridView,listView起始位置不是最顶部的解决办法
- Android ScrollView中嵌套ListView滚动效果冲突问题解决
- 解决ScrollView中嵌套ListView滚动效果冲突问题 & ListVIew点击事件失效
- 解决ScrollView中listview、gridview的嵌套问题
- ScrollView中嵌套ListView滚动效果冲突问题解决
- 解决ScrollView下嵌套ListView、GridView显示不全的问题(冲突)