问题背景:在项目中,要求在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会覆盖子类控件而直接获得焦点
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
此外,在我查找资料时,还有一位博友提供了另外一种简单的解决办法,在这里我就不详细说了,有兴趣的朋友可以点击链接去查看参考: