解决ScrollView中嵌套ListView或GridView导致的ScrollView自动滚动到ListView或GridView位置的问题

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值