6

mam RecyclerView stosując LinearLayoutManager z HORIZONTAL orientacji zagnieżdżona wewnątrz FrameLayout pomocą BottomSheetBehavior.RecyclerView (poziomo) zagnieżdżone BottomSheet zapobiegania pionowe przesuwanie

Podczas próby przeciągnięcia w pionie pomiędzy RecyclerView, BottomSheet nie odpowiada na zdarzenie przeciągania. Prawdopodobnie dzieje się tak dlatego, że pionowe przewijanie jest wyłączone dla ustawienia LayoutManager z orientacją poziomą.

Próbowałem przesłonić LinearLayoutManager.canScrollVertically() i zwracając true. Ten sortuje działa .. Jeśli przeciągniesz pionowo w bardzo ostrożny sposób, odpowie. Jednak w przypadku jakiegokolwiek ruchu poziomego, BottomSheet przestaje odpowiadać na zdarzenia pionowego przeciągania.

Nie jestem pewien, czy przesłonięcie canScrollVertically() jest właściwym podejściem - z pewnością nie jest to właściwe z punktu widzenia UX.

Zauważyłam również, że jeśli używam ViewPager raczej niż RecyclerView z poziomo LayoutManager Z BottomSheet reaguje na pionowych wydarzeń magnetycznych zgodnie z zapotrzebowaniem.

Czy istnieje jakaś inna metoda LayoutManager, RecyclerView, BottomSheet Behavior, czy coś zupełnie innego, który może pomóc propagować pionowe zdarzenia przewijania do BottomSheet Behavior?

Jest przykładem problemu tutaj:

https://github.com/timusus/bottomsheet-test (problem można odtworzyć z popełnić # f59a7031)

Wystarczy rozwinąć pierwszy prześcieradło.

Odpowiedz

6

Gdzie leży problem? W FrameLayout. BottomSheet działa idealnie po umieszczeniu wewnątrz CoordinatorLayout. Następnie BottomSheet może przekazać swój przewijany stan przez CoordinatorLayout do innych widoków umieszczonych jako bezpośrednie dzieci CoordinatorLayout.

Dlaczego RecyclerView nie można przekazać stanu przewijania do BottomSheet? To nie jest bezpośrednie dziecko z CoordinatorLayout. Ale istnieje sposób, aby je przekazać: RecyclerView musi być w widoku, który implementuje NestedScrollingParent i NestedScrollingChild. Odpowiedź na to pytanie brzmi: NestedScrollView

więc fragment_sheetX.xml układy powinna wyglądać następująco:

<?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> 

Wskazówka także android:fillViewport="true" inaczej, Twój RecyclerView nie weźmie całą wysokość.

Jednak nadal nie będzie działać. Czemu? RecyclerView należy poinformować, aby przekazał przewijanie w pionie rodzicowi. W jaki sposób? Odpowiedź brzmi: recyclerView.setNestedScrollingEnabled(false);, ale jest to lepiej opisane: here.

Przy okazji: MultiSheetView to wspaniała cecha i bardzo interesujące podejście do mobilnego projektowania UX.

+0

Podejrzewałem, że 'FrameLayout' uniemożliwia propagowanie zdarzeń przewijania do 'CoordinatorLayout'. Myślę, że w pewnym momencie zbliżyłem się do tego rozwiązania, ale miałem problem z problemem z rzutnią. Dzięki wielkie. –