Reputation: 4477
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
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
Reputation: 3791
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
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
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