您的位置:首页 > 其它

解决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
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐