Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RecyclerView inside the bottomsheet is not working

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.

like image 209
andinrajesh Avatar asked May 17 '17 11:05

andinrajesh


People also ask

Can we use RecyclerView inside RecyclerView in Android?

A nested RecyclerView is an implementation of a RecyclerView within a RecyclerView. An example of such a layout can be seen in a variety of apps such as the Play store where the outer (parent) RecyclerView is of Vertical orientation whereas the inner (child) RecyclerViews are of horizontal orientations.

How do I disable BottomSheetDialogFragment dragging?

Disable drag of BottomSheetDialogFragment It can also be disabled by overriding onStateChanged() . This will set the expanded state even if user drags the view.

Is RecyclerView deprecated?

Today, suddenly Recyclerview. Viewholder became deprecated. Other, android project is no deprecated.

What is RecyclerView LayoutManager?

A LayoutManager is responsible for measuring and positioning item views within a RecyclerView as well as determining the policy for when to recycle item views that are no longer visible to the user.


2 Answers

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;
    }
});
like image 87
lincy Avatar answered Oct 10 '22 05:10

lincy


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.

like image 44
Matt Avatar answered Oct 10 '22 05:10

Matt