RecyclerView inside the bottomsheet is not working
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.
andinrajesh
Updated on June 11, 2022Comments
-
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.