NestedScrollView滚到顶部失效

scrollView.smoothScrollTo(0, 0)
本来可以再页面刚加载的时候滚到顶部,但是因为内部包裹了RecycvlerView   Recyclerview再加载完数据之后自动获得焦点滚动到顶部,如果恰好recyclerview不是scrollView的第一个子控件,就会导致  scrollView.smoothScrollTo(0, 0)失效

解决办法,在 recyclerView的父控件中加入

android:focusable="true"
android:focusableInTouchMode="true"

这样就可以

 

原理

 

ScrollView调用addViewInner方法的时候,会先判断view.hasFocus(),其中view.hasFocus()的判断有两个规则:1.是当前的view在刚显示的时候被展示出来了,hasFocus()才可能为true;2.同一级的view有多个focus的view的话,那么只是第一个view获取焦点。
如果在布局中view标签增加focusableInTouchMode=true属性的话,意味这当我们在加载的时候,标签view的hasfocus就为true了,然而当在获取其中的子view的hasFocus方法的值的时候,他们就为false了。(这就意味着scrollview虽然会滑动,但是滑动到添加focusableInTouchMode=true属性的view的位置,如果view的位置就是填充了scrollview的话,相当于是没有滑动的,这也就是为什么在外布局增加focusableInTouchMode=true属性能阻止ScrollView会自动滚动到获取焦点的子view的原因)所以在外部套一层focusableInTouchMode=true并不是严格意义上的说法,因为虽然我们套了一层view,如果该view不是铺满的scrollview的话,很可能还是会出现自动滑动的。所以我们在套focusableInTouchMode=true属性的情况,最好是在ScrollView的直接子view 上添加就可以了。

 

更详细的理解可以看这个

https://segmentfault.com/a/1190000011509975

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值