在垂直 RecyclerView 的 Header 中嵌入水平 RecyclerView 時,手指按在水平列表上下拉,垂直列表會異常跳動一大段距離,而非平滑滑動。這是典型的觸摸事件攔截衝突。
RecyclerView(主列表)RecyclerView(橫向滾動區)
水平 RecyclerView 的 OnTouchListener 或巢狀滑動機制(NestedScrolling)攔截了觸摸事件,導致外層垂直列表無法正確接收 ACTION_MOVE 事件,或錯誤計算滑動距離。具體常見於 Header 的 LayoutParams 或 NestedScrollingParent 實作不當。
horizontalRecyclerView.setNestedScrollingEnabled(false);
FrameLayout 或 LinearLayout 覆寫 onInterceptTouchEvent,當檢測到垂直滑動意圖時返回 true,交給父列表處理。RecyclerView 官方 Header 支援:採用 ConcatAdapter(AndroidX 1.2+)或 HeaderAndFooterWrapper 模式,避免手動管理 Header View 的觸摸邏輯。match_parent / wrap_content 設定正確,避免測量錯誤導致位置跳躍。提問者最終回饋:「已解決,是 headerView 的問題」。經比對,最快生效的做法是:
FrameLayout,並覆寫 onInterceptTouchEvent 針對垂直滑動攔截。RecyclerView 上呼叫 setNestedScrollingEnabled(false)。ConcatAdapter 組合多種列表型別,減少手動 Header/Footer 管理。RecyclerView 時,明確設定 nestedScrollingEnabled 避免事件搶奪。LayoutInspector 觀察 View 階層與觸摸事件流向。解決此類滑動衝突,關鍵在於釐清觸摸事件分發鏈,並在適當層級攔截或放行事件,確保使用者操作符合直覺預期。