2019年11月24日 星期日

[Android] NestedScrollView 嵌套 RecyclerView 時 Scoll 位置停在 RecyclerView

markdown 最近遇到的問題是,Fragment 中為一個 NextedScrollView ,裡面從上至下有 Button 等不同的 View,最下方是 RecyclerView,但是在 Fragment 顯示時,NextedScrollView 會自動滑動到 RecyclerView 的位置。 會這樣的原因是因為,NextedScrollView 在繪製時,會去找尋 child view 中有沒有 has focus 的 child view,如果有,則滾動到它的位置。而 RecyclerView 是它找到的 has focus 的 child view,因此位置就移動到 RecyclerView 了。 這也是為什麼有人呼叫 RecyclerView.setFoucsable(false) 後,就不會發生自動滾動了,因為沒有找到 has focus 的 child view。不過最好的解法,應該是在 NextedScrollView 的直接子 view 中增加 [descendantFocusability](https://developer.android.com/reference/android/view/ViewGroup#attr_android:descendantFocusability) 屬性並將之設為 blocksDescendants, 因為 NextedScrollView 繪製過程中看到了 child view 有這個屬性,就不會再做自動滾動的動作了。
<LinearLayout
    android:id="@+id/container"
    android:descendantFocusability="blocksDescendants"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
--- Reference: * [NestedScrollView、RecycleView、ViewPager 等布局方面的常见问题汇总,及解决](https://www.jianshu.com/p/8dd1e902b7cd) * [NestedScrollview won't start from top](https://stackoverflow.com/questions/33584187/nestedscrollview-wont-start-from-top) * [Recycler view inside NestedScrollView causes scroll to start in the middle](https://stackoverflow.com/questions/36314836/recycler-view-inside-nestedscrollview-causes-scroll-to-start-in-the-middle) * [ScrollView(RecyclerView等)为什么会自动滚动原理分析,还有阻止自动滑动的解决方案](https://juejin.im/post/5a2a04726fb9a045055e0993)

沒有留言:

張貼留言