Manish Patiyal
Manish Patiyal

Reputation: 4477

SwipeRefreshLayout obstructs the scroll of recycleview at the time of scrolling up

In my recycleview when I scroll up in the list, the swiperefreshlayout is triggered which hinders the movement of my list in the upward direction. I went through this blog but it solves this problem for listview. Is there any similar work around for this problem for recycleview as onscrollListener is deprecated which is used in this blog.

<android.support.design.widget.CoordinatorLayout 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:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    app:layout_scrollFlags="scroll|exitUntilCollapsed"
    tools:context="com.morpho.innovationlab.trustwall.Dashboard">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="250dp"
        android:fitsSystemWindows="true"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="horizontal"
                app:layout_collapseMode="parallax"
                app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed">

                <ImageView
                    android:id="@+id/backdrop"
                    android:layout_width="100dp"
                    android:layout_height="100dp"
                    android:layout_margin="10dp"
                    android:importantForAccessibility="no"
                    android:src="@drawable/tw_logo"
                    app:layout_collapseMode="parallax"
                    app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed" />

                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_margin="40dp"
                    android:layout_weight="1"
                    android:orientation="vertical">


                    <TextView
                        android:id="@android:id/text1"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="Trustwall"
                        android:textColor="@android:color/white"
                        android:textSize="24sp"
                        app:layout_collapseMode="parallax"
                        app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="Your Privacy is our priority"
                        android:textColor="@android:color/white"
                        android:textSize="12sp"
                        app:layout_collapseMode="parallax"
                        app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed" />
                </LinearLayout>

            </LinearLayout>

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:layout_scrollFlags="scroll|enterAlways"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

        </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swipeRefreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">


        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

            <TextView

                android:id="@+id/emptyview"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_margin="50dp"
                android:gravity="center_horizontal"
                android:text="Click on the Add button to add websites to trustwall secure zone."
                android:visibility="gone" />

            <android.support.v7.widget.RecyclerView
                android:id="@+id/rv"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scrollbars="vertical"
                app:layout_behavior="@string/appbar_scrolling_view_behavior" />


        </FrameLayout>
    </android.support.v4.widget.SwipeRefreshLayout>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/add_website"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_marginBottom="20dp"
        android:layout_marginRight="20dp"
        android:src="@drawable/ic_add"
        app:elevation="12dp"
        app:pressedTranslationZ="12dp" />
    />
</android.support.design.widget.CoordinatorLayout>

Upvotes: 2

Views: 2266

Answers (4)

Rao Jilani
Rao Jilani

Reputation: 11

**This Swipe Refresh Layout Util function to use any place to call on application and perform your requirement in listener  **



    public static void setMoveUpOnRefreshListener( final SwipeRefreshLayout layout, final OnRefreshListener listener,RecyclerView recyclerView) {
        if (layout != null) {
            layout.setOnChildScrollUpCallback((parent, child) -> {
                int topRowVerticalPosition =
                        (recyclerView == null || recyclerView.getChildCount() == 0) ? 0 : recyclerView.getChildAt(0).getTop();
                layout.setEnabled(topRowVerticalPosition >= 0);
                return false;
            });
            layout.setOnRefreshListener(() -> {
//                Logger.log("mTopSwipeRefreshLayout onRefresh");
              
                layout.setRefreshing(true);
                if (listener != null) {
                    listener.onRefresh();
                }

            });
            // sets the colors used in the refresh animation
            layout.setColorSchemeResources(
                    R.color.primarydark,
                    R.color.primary);
        }
    }



public interface OnRefreshListener {
    void onRefresh();
}

Upvotes: 0

Sunil
Sunil

Reputation: 3791

Try this

I was unable to implement the setOnScrollListenner that @Manish Patiyal has answered, so I tried another solution that is working fine for me.

 recycler_view.addOnScrollListener(new RecyclerView.OnScrollListener() { //Used to restrict collapsing of recycler view horizontal swipe and swipe refresh layout
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            if (linearlayoutmanager.findFirstCompletelyVisibleItemPosition() == 0)
                swipeRefreshLayout.setEnabled(true);
            else
                swipeRefreshLayout.setEnabled(false);
        }
    });

Upvotes: 0

Manish Patiyal
Manish Patiyal

Reputation: 4477

I finally achieved the right behaviour by implementing the setOnScrollListenner of the recycleview.

 @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            int topRowVerticalPosition =
                    (recyclerView == null || recyclerView.getChildCount() == 0) ? 0 : recyclerView.getChildAt(0).getTop();
            swipeRefreshLayout.setEnabled(topRowVerticalPosition >= 0);

        }

Upvotes: 5

Jintin
Jintin

Reputation: 1478

It's the same idea.

You may custom the RecycleView and set when it will consume the touch event or by pass.

Then the SwipeRefreshLayout can receive the touch event.

Upvotes: 0

Related Questions