RecyclerView inside the bottomsheet is not working

10,627

Solution 1

This is the working code for RecyclerView inside BottomSheet

XML:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">


            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/recyclerViewMore"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:focusableInTouchMode="true"
                android:orientation="vertical"
                app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
          
        </RelativeLayout>

    </androidx.coordinatorlayout.widget.CoordinatorLayout>

</layout>

In Java in onCreateView

B.recyclerViewMore.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.getParent().requestDisallowInterceptTouchEvent(true);
        v.onTouchEvent(event);
        return true;
    }
});

Solution 2

lincy's solution didn't work for me. The events never got through to the OnTouchListener.

My solution is to wrap the RecyclerView with a custom layout that hooks into dispatchTouchEvent:

<info.mschmitt.view.TouchEventInterceptorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />

</info.mschmitt.view.TouchEventInterceptorLayout>

The code for TouchEventInterceptorLayout (constructors removed):

public class TouchEventInterceptorLayout extends FrameLayout {
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        boolean handled = super.dispatchTouchEvent(ev);
        requestDisallowInterceptTouchEvent(true);
        return handled;
    }
}

That will recursively disable touch event handling in all parents for the current touch interaction, leaving only the RecyclerView as a target for processing.

Why all of this is necessary I don't know. Maybe it's a bug in Google's BottomSheet implementation.

Share:
10,627
andinrajesh
Author by

andinrajesh

Updated on June 11, 2022

Comments

  • andinrajesh
    andinrajesh almost 2 years

    Following are my xmls

    MainView

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <!-- Your content -->
        <include layout="@layout/content_main"/>
    
        <!-- Bottom Sheet -->
        <include layout="@layout/main_bottom_sheet"/>
    
    </android.support.design.widget.CoordinatorLayout>
    

    BottomSheet View

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/bottom_navigation_sheet"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#FFFFFF"
        android:orientation="vertical"
        app:behavior_peekHeight="56dp"
        app:layout_behavior="@string/bottom_sheet_behavior">
    
        <FrameLayout
            android:id="@+id/fragment_bottom_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    
    </LinearLayout>
    

    RecycleView Screen

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  xmlns:app="http://schemas.android.com/apk/res-auto"
                  xmlns:tools="http://schemas.android.com/tools"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:background="@color/white"
                  android:orientation="vertical">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="@dimen/toolbar_height"
            android:background="@color/alabaster"
            android:elevation="@dimen/elevation_normal"
            android:orientation="horizontal"
            tools:targetApi="lollipop">
    
            <FrameLayout
                android:id="@+id/search_as_you_type_back_button"
                android:layout_width="@dimen/toolbar_height"
                android:layout_height="@dimen/toolbar_height"
                android:foreground="?selectableItemBackground">
    
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:contentDescription="@string/accessibility_back"
                    app:srcCompat="@drawable/ic_arrow_back"/>
    
            </FrameLayout>
    
            <EditText
                android:id="@+id/search_as_you_type_edit_text"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_marginStart="@dimen/margin_medium"
                android:layout_weight="1"
                android:background="@color/transparent"
                android:focusable="true"
                android:focusableInTouchMode="true"
                android:gravity="center_vertical"
                android:imeOptions="actionSearch"
                android:inputType="text"
                android:textColor="@color/darkest_grey"
                android:textSize="@dimen/text_medium"
                tools:text="Chocolate"/>
    
            <FrameLayout
                android:id="@+id/search_as_you_type_close_container"
                android:layout_width="?attr/actionBarSize"
                android:layout_height="?attr/actionBarSize"
                android:foreground="?selectableItemBackground"
                android:visibility="invisible">
    
                <ImageView
                    android:id="@+id/search_as_you_type_close"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:contentDescription="@string/accessibility_close"
                    app:srcCompat="@drawable/ic_cancel_grey_24dp"/>
    
            </FrameLayout>
    
        </LinearLayout>
    
        <ViewFlipper
            android:id="@+id/view_flipper"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:inAnimation="@android:anim/fade_in"
            android:outAnimation="@android:anim/fade_out">
    
    
          <android.support.v7.widget.RecyclerView
              android:id="@+id/auto_suggest_list"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              app:layout_behavior="@string/appbar_scrolling_view_behavior"
              android:nestedScrollingEnabled="true"/>
    
    
        </ViewFlipper>
    
    </LinearLayout>
    

    Fragment bottom container layout will be inflated with a fragment which has recyclerview screen. The Recyclerview here is not scrolling after populating it with data. As well its not getting adjusted when the keyboard pops up. I tried setting windowssoftInputMode. Could someone help in how to solve this.