Niyamat Ullah
Niyamat Ullah

Reputation: 2394

When I am scrolling up SwipeRefreshLayout refreshing my app

I am created an app that downloaded some data from internet and show them in a list using recyclerView.So I added SwipeRefreshLayout so that when user is at the beginning of the page he can pull from top to refresh (like facebook app).But In my app when I scroll down and again trying to scrolling up the SwipeRefreshLayout shows up and refreshing my page.

I also search the internet but can't get the right answer.

I try this solution but it doesn't work anymore(Because I am using recyclerView).

Here is some of the code of my app for better understanding...

activity_main

<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipeToRefresh"
android:layout_height="match_parent"
android:layout_width="match_parent">
<include layout="@layout/content_main"/>
</android.support.v4.widget.SwipeRefreshLayout>

MainActivity.java

//.....
public SwipeRefreshLayout mSwipeRefreshLayout;

protected void onCreate(Bundle savedInstanceState) {
//....
mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeToRefresh);
    mSwipeRefreshLayout.setOnRefreshListener(this);
//......
}

//.......

@Override
public void onRefresh() {
    Api.getBlog(mBlogListAdapter);
}

Api Response

 //.......
 @Override
public void onResponse(Call<AllBlog> call, Response<AllBlog> response) {
    //.......
    mActivity.mSwipeRefreshLayout.setRefreshing(false);
}

In my adapter

//........
public class BlogListViewHolder extends RecyclerView.ViewHolder implements View.OnScrollChangeListener{
    public ImageView mBlogImage;
    public TextView mBlogTitle;
    public TextView mBlogAuthor;
    public BlogListViewHolder(View itemView) {
        super(itemView);
        mBlogImage = (ImageView) itemView.findViewById(R.id.blogPhoto);
        mBlogTitle = (TextView) itemView.findViewById(R.id.blogTitle);
        mBlogAuthor = (TextView) itemView.findViewById(R.id.blogAuthor);
    }
}

I also tried implementing View.OnScrollChangeListener but it also not work.

public class BlogListViewHolder extends RecyclerView.ViewHolder implements View.OnScrollChangeListener{
    public ImageView mBlogImage;
    public TextView mBlogTitle;
    public TextView mBlogAuthor;
    public BlogListViewHolder(View itemView) {
        super(itemView);
        mBlogImage = (ImageView) itemView.findViewById(R.id.blogPhoto);
        mBlogTitle = (TextView) itemView.findViewById(R.id.blogTitle);
        mBlogAuthor = (TextView) itemView.findViewById(R.id.blogAuthor);

        itemView.setOnScrollChangeListener(this);
    }

    @Override
    public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
        if (v.getVerticalScrollbarPosition() == 0) {
            mActivity.mSwipeRefreshLayout.setEnabled(true);
        } else {
            mActivity.mSwipeRefreshLayout.setEnabled(false);
        }
    }
}

Upvotes: 10

Views: 7924

Answers (4)

Dhunju_likes_to_Learn
Dhunju_likes_to_Learn

Reputation: 1376

For me I had to remove the following line which I had added to test something else,

recyclerView.setNestedScrollingEnabled(false);

And for the record, I have applied SwipeRefreshLayout to the whole layout itself, not wrapped it to just my RecyclerView. Dunno if it is right or wrong but it does work.

Hope this helps someone!

Upvotes: 0

Dnyaneshwar Panchal
Dnyaneshwar Panchal

Reputation: 444

Use SwipeRefreshLayout this way.

<android.support.v4.widget.SwipeRefreshLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/swipeContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/Recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#e0e0e0"
        android:overScrollMode="never"> 
</android.support.v7.widget.RecyclerView>
    </android.support.v4.widget.SwipeRefreshLayout>

Upvotes: 0

Chintan Soni
Chintan Soni

Reputation: 25267

I think you have implemented SwipeRefreshLayout to whole layout itself. This is not the correct way to implement SwipeRefreshLayout. You should wrap SwipeRefreshLayout to just your RecyclerView, instead of whole layout.

Like below:

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

Upvotes: 17

pamitha
pamitha

Reputation: 55

 //create interface
  public interface YourFragmentInterface {
   void fragmentBecameVisible();
  }

 //implements YourFragmentInterface

        @Override
        public void fragmentBecameVisible() 

        // refresh detail
        }

Upvotes: 0

Related Questions