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

发布了137 篇原创文章 · 获赞 29 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/xiexiaotian11/article/details/98182822