6

Tôi có một RecyclerView sử dụng một LinearLayoutManager với HORIZONTAL định hướng, lồng vào bên trong một FrameLayout sử dụng BottomSheetBehavior.RecyclerView (ngang) lồng trong BottomSheet ngăn chặn dọc di chuyển

Khi cố gắng kéo theo chiều dọc trên RecyclerView, BottomSheet không phản hồi sự kiện kéo. Có lẽ điều này là do di chuyển dọc bị tắt cho một LayoutManager với hướng nằm ngang.

Tôi đã cố gắng ghi đè LinearLayoutManager.canScrollVertically() và trả về true. Điều này loại hoạt động .. Nếu bạn kéo theo chiều dọc một cách rất cẩn thận, BottomSheet sẽ phản hồi. Tuy nhiên, ngay khi có bất kỳ chuyển động ngang nào, các điểm dừng BottomSheet sẽ phản hồi các sự kiện kéo dọc.

Tôi không chắc chắn nếu ghi đè canScrollVertically() là cách tiếp cận phù hợp tại đây - chắc chắn không cảm thấy đúng từ quan điểm của UX.

Tôi cũng nhận thấy rằng nếu tôi sử dụng ViewPager thay vì RecyclerView với chiều ngang theo chiều ngang LayoutManager, thì BottomSheet sẽ phản hồi các sự kiện vuốt dọc như mong muốn.

Có phương pháp nào khác là LayoutManager, RecyclerView, BottomSheet Behavior hoặc một thứ khác hoàn toàn có thể giúp truyền bá sự kiện cuộn dọc lên BottomSheet Behavior?

Có một ví dụ về các vấn đề ở đây:

https://github.com/timusus/bottomsheet-test (Vấn đề có thể được sao chép với cam # f59a7031)

Chỉ cần mở rộng tấm đáy đầu tiên.

Trả lời

6

Sự cố nằm ở đâu? Trong FrameLayout. BottomSheet hoạt động hoàn hảo khi đặt bên trong CoordinatorLayout. Sau đó, BottomSheet có thể chuyển trạng thái cuộn qua CoordinatorLayout đến các chế độ xem khác được đặt dưới dạng con trực tiếp của CoordinatorLayout.

Tại sao RecyclerView không thể chuyển trạng thái cuộn sang BottomSheet? Nó không phải là con trực tiếp của CoordinatorLayout. Nhưng có một cách để vượt qua chúng: RecyclerView phải được đặt trong chế độ xem thực hiện NestedScrollingParentNestedScrollingChild. Câu trả lời cho đó là: NestedScrollView

Vì vậy fragment_sheetX.xml bố trí của bạn sẽ giống như thế:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.NestedScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#fff" 
    android:orientation="vertical" 
    android:fillViewport="true"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

</android.support.v4.widget.NestedScrollView> 

Thông báo cũng android:fillViewport="true" nếu không, RecyclerView của bạn sẽ không mất toàn bộ chiều cao.

Tuy nhiên, nó vẫn không hoạt động. Tại sao? RecyclerView phải được thông báo để di chuyển dọc sang phụ huynh. Làm sao? Câu trả lời là recyclerView.setNestedScrollingEnabled(false);, nhưng đó là mô tả tốt hơn here.

Btw: MultiSheetView là một tính năng tuyệt vời và một cách tiếp cận rất thú vị đối với thiết kế UX trên thiết bị di động.

+0

Tôi nghi ngờ 'FrameLayout' ngăn sự kiện cuộn từ việc truyền sang 'CoordinatorLayout'. Tôi nghĩ rằng tôi đã gần với giải pháp này tại một số điểm, nhưng đã gặp rắc rối với vấn đề viewport. Cám ơn rất nhiều. –

Các vấn đề liên quan